Systemd:mongodb 之后自动启动服务

Systemd:mongodb 之后自动启动服务

ubuntu16.04.1,系统

应用程序依赖于 mongodb。应用程序和 mongodb 均在启动时作为服务启动。app.service包含下一行:

After=network.target mongod.service

不幸的是,应用程序失败了(连接到数据库错误),我猜测是因为 mongodb 需要一些时间来启动并准备好连接(如果我稍后启动该应用程序,一切都正常)。

Type=notify如果 mongodb 向 systemd 发送适当的通知,那么(在[Service]的部分中)似乎mongod.service可以解决问题。但我没有找到有关它的任何文档。

问题是,在 mongodb 准备好接收传入连接后,如何自动启动应用程序。

答案1

为了将来参考,我发现这个解决方案有效:https://gist.github.com/jwilm/5842956#gistcomment-2706797这样,mongodb 就会阻塞,直到数据库可访问,然后 systemd 才会启动下一个服务。并且它不涉及睡眠。

如果您有依赖于 mongodb 的服务,则配置会稍微困难一些,因为默认的 mongodb 服务会在数据库上线之前返回。这可能会导致快速应用程序尝试连接数据库但失败。为防止这种情况,请将以下内容添加到 /etc/mongod.conf:

processManagement:
    fork: true

接下来,创建 /etc/systemd/system/mongod.service.d/mongod.conf (扩展现有的 /lib/systemd/system/mongod.service),内容如下:

[Service]
Type=oneshot
RemainAfterExit=yes

这会导致 sudo systemctl start mongod 在分叉进程中启动服务器,并且仅在数据库启动并准备好连接后返回。这样,依赖服务仅在数据库处于活动状态后才会被调用。

答案2

正如在另一个答案中看到的,一个好的解决方案是:

  • 告诉 mongodb 服务器进行分叉。“这样 mongodb 就会阻塞,直到数据库可访问为止”
  • 告诉 systemd 等待 fork

这正是 RedHat 默认的做法(参见mongodb.conf&mongodb.服务

因此让我们在 debian/ubuntu 上做同样的事情:

  • 为 pid 文件创建目录:install -d -o mongodb /run/mongodb
  • 添加至/etc/mongod.conf:
processManagement:
  fork: true
  pidFilePath: /run/mongodb/mongod.pid
  • 添加文件 /etc/systemd/system/mongod.service.d/processManagement-fork.conf
[Service]
PIDFile=/run/mongodb/mongod.pid
Type=forking

(注意:我创建了另一个答案,因为 PIDFILE + Type=forking 比 RemainAfterExit + Type=oneshot 更好)

答案3

我遇到了类似的问题...我想在 MongoDB 准备好接受连接后启动 Mongo-Connector。

我在谷歌上搜索了一下后找到了解决办法。解决办法是在 mongodb 单元文件中的 ExecStart 行之后添加以下 ExecStartPost 行。

ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
ExecStartPost=/bin/sh -c 'while ! /usr/bin/mongo --eval "db.version()" > /dev/null 2>&1; do sleep 0.1; done'

这已在我的 Ubuntu 16.04 服务器上成功测试。

相关内容