在特定服务之后启动systemd服务?

114

我有一个普遍的问题。如何在特定的*.service成功启动后启动systemd unit *.service

更具体的问题是,我如何在mongodb.service成功启动后仅启动website.service?换句话说,website.service应该依赖于mongodb.service


1
这个问题应该属于ServerFault,对吧? - Rémi
1
@Rémi 在两个网站上都可以,没问题! :) - Anonymous Penguin
2
@AnonymousPenguin 不,只是你回复的时间比较晚,这不是一个适合在SO上讨论的问题。这与编程无关。SF或者更好的选择是Unix/Linux.SE。 - underscore_d
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。 - jww
可能相关的ServerFault问题:https://serverfault.com/questions/812492/systemd-automatically-start-restart-specific-systemd-service-after-another-ser - Compholio
2个回答

160
在 .service 文件的 [Unit] 部分中:
[Unit]
Description=My Website
After=syslog.target network.target mongodb.service

重要的部分是 mongodb.service

尽管手册描述了它,但由于格式问题,一开始并不是很清晰

systemd.unit - 格式良好

systemd.unit - 格式不太好


1
我们的mongod服务启动了一个非常大的数据库。随后的服务无法正确启动,因为似乎mongo在启动后需要更多时间来加载数据库。因此,我们的第二个服务启动了,但由于mongo已经成功启动但尚未加载数据库,所以失败了。也许延迟可以帮助解决这个问题... - wayofthefuture
systemd服务是否能够处理以下情况。考虑多个服务A、B、C、D。如果A存在,则我希望B、C、D在A之后启动,否则如果A不存在,则B、C、D可以按任何顺序启动。请帮忙。 - achilles
@achilles 你能否在不需要 A 的系统上创建一个假的 A 服务。这样可以保持 B、C 和 D 的依赖关系简单。 - Walter A
正确的HTML文档在这里:https://www.freedesktop.org/software/systemd/man/systemd.unit.html - istepaniuk
“格式良好”的 man 手册看起来相当过时了。它不应该被移除吗? - Pranav

63

After= 依赖项仅在服务(包括 After=)和由 After= 包含的服务都计划作为引导的一部分启动时才有效。

例如:

a.service
[Unit]
After=b.service

如果同时启用了a.serviceb.service,那么systemd将会在a.service之后排序b.service

如果我没有误解你的意思,你的问题是如何在b.service未启用的情况下,在a.service启动时启动b.service

这个指令是在[Unit]下使用Wants=Requires=

website.service
[Unit]
Wants=mongodb.service
After=mongodb.service
Wants=Requires= 的区别在于,使用 Requires=,如果无法启动 b.service,将导致无法启动 a.service,但是使用 Wants=,即使 b.service 失败,a.service 也会启动。详细信息请参见.unit 的 man 页面

13
我相信,这个回答的真相恰恰相反。After=website.service 的意思是“在 website.service 运行后再运行我的单元!”。文档中已经解释了这一点:"After= 保证配置的单元在列出的单元启动完成后启动"。我假设“列出的单元”指的是在“After=”右边的单元。 - Sindarus
2
这样,如果a.service和b.service都启用,则systemd将在a.service之后对b.service进行排序。你是不是想说反过来?swap(a, b) - Mateen Ulhaq
@Sindarus 在你发布的同一个链接中,证明了这个答案是正确的。After= 仅在服务同时启动时(例如引导)才发挥作用,否则 After= 毫无意义。添加 Wants=Requires= 以自动启动另一个进程。请注意,这些设置与由 Requires=、Wants=、Requisite= 或 BindsTo= 配置的要求依赖关系是独立且正交的。常见的模式是在 After= 和 Wants= 选项中都包含一个单元名称,在这种情况下,列出的单元将在使用这些选项配置的单元之前启动。 - RcoderNY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接