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 服务器上成功测试。