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
我猜这个问题的答案已经在 serverfault 中了。简而言之:也许你应该使用Requires
而不是After
。
Requires
意味着你的服务需要其他服务才能正常工作,而不是应该“在之后启动”。
https://serverfault.com/questions/812584/in-systemd-whats-the-difference-between-after-and-requires