在特定服务之后启动 systemd 服务? [关闭]
Posted
技术标签:
【中文标题】在特定服务之后启动 systemd 服务? [关闭]【英文标题】:Start systemd service after specific service? [closed] 【发布时间】:2014-03-16 20:13:45 【问题描述】:我有一个一般性问题。在特定的*.service
成功启动后,如何启动系统单元*.service
?
更具体的问题是,我如何在mongodb.service
启动后才启动website.service
?换句话说,website.service
应该依赖于mongodb.service
。
【问题讨论】:
这个问题属于ServerFault,没有? @Rémi 两个站点都可以! :) @AnonymousPenguin 不,只是在您回复之前 3.5 年,这不是 SO 的主题问题。这与编程无关。 SF 或者更好的 Unix/Linux.SE 会更合适。 Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地点。 可能相关的ServerFault问题:serverfault.com/questions/812492/… 【参考方案1】:在 [Unit] 部分下的 .service 文件中:
[Unit]
Description=My Website
After=syslog.target network.target mongodb.service
重要的部分是mongodb.service
手册页对其进行了描述,但是由于格式设置,乍一看并不那么清楚
systemd.unit - well formatted
systemd.unit - not so well formatted
【讨论】:
我们的 mongod 服务启动了一个非常大的数据库。后续服务无法正确启动,因为启动后似乎 mongo 需要更多时间来加载数据库。所以我们的第二个服务启动但失败了,因为 mongo 已经成功启动但还没有加载数据库。也许延迟会有所帮助... systemd 服务是否可以处理以下场景。考虑多个服务 A、B、C、D 。如果 A 存在,我希望 B、C、D 仅在 A 之后启动,否则如果 A 不存在 B、C、D 可以按任何顺序启动。请帮忙 @achilles 你能在不需要 A 的系统上创建一个假服务 A。这样B、C、D的依赖关系就可以保持简单。 正确的 html 文档在这里:freedesktop.org/software/systemd/man/systemd.unit.html【参考方案2】:After=
依赖项仅在包括After=
的服务和After=
包括的服务都计划作为启动的一部分启动时才有效。
例如:
a.service
[Unit]
After=b.service
这样,如果a.service
和b.service
都启用,那么systemd 将在a.service
之后排序b.service
。
如果我没有误解,您要问的是如何在a.service
启动时启动b.service
,即使b.service
未启用。
用于此的指令是Wants=
或Requires=
在[Unit]
下。
website.service
[Unit]
Wants=mongodb.service
After=mongodb.service
Wants=
和Requires=
的区别在于Requires=
启动失败b.service
会导致a.service
启动失败,而Wants=
,a.service
甚至会启动如果b.service
失败。这在the man page of .unit
上有详细解释。
【讨论】:
我相信事实与这个答案完全相反。After=website.service
表示“在 website.service 之后执行我的单元!”。这就是文档中解释的内容:"After= ensures that the configured unit is started after the listed unit finished starting up"。我假设“列出的单位”是“After=”右侧的单位。
"这样的话,如果a.service和b.service都开启了,那么systemd会在a.service之后订购b.service。"你的意思不是反过来吗? swap(a, b)
以上是关于在特定服务之后启动 systemd 服务? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章