在特定服务之后启动systemd服务?[关闭]


81

我有一个一般性的问题。成功启动*.service特定单元后,如何启动systemd单元*.service

更具体的问题是,如何website.service仅在启动后才能mongodb.service启动?换句话说website.service应该依靠mongodb.service


1
这个问题属于ServerFault,不是吗?
雷米

1
@Rémi在两个站点上都可以!:)
匿名企鹅

2
@AnonymousPenguin不,就在您回复之前大约3.5年,这不是SO的热门问题。这与编程无关。SF,或者更好的是Unix / Linux.SE会更合适。
underscore_d

堆栈溢出是一个有关编程和开发问题的网站。这个问题似乎与主题无关,因为它与编程或开发无关。请在帮助中心中查看我可以询问哪些主题。也许超级用户Unix&Linux Stack Exchange是一个更好的选择。
jww

Answers:


113

在[服务]部分下的.service文件中:

[Unit]
Description=My Website
After=syslog.target network.target mongodb.service

重要的是 mongodb.service

手册页对此进行了描述,但是由于格式的原因,乍一看并不清楚

systemd.unit-格式正确

systemd.unit-格式不正确


1
我们的mongod服务启动了一个非常大的数据库。后续服务无法正确启动,因为启动后似乎mongo需要更多时间来加载数据库。因此我们的第二项服务启动但失败,因为mongo已成功启动但尚未加载数据库。也许延迟可能会有所帮助...
Wayofthefuture 2017年

systemd服务是否有可能处理以下场景。请考虑多个服务A,B,C,D。如果A存在,我希望B,C,D仅在A之后开始,否则,如果A不存在,则B,C,D可以以任何顺序开始。请帮助
阿基里斯

@achilles是否可以在不需要A的系统上创建伪造的服务A。这样,B,C,D的依赖关系可以保持简单。
Walter A

49

After=仅当After=包含服务和包含的服务After=都计划在启动过程中启动时,依赖项才有效。

例如:

a.service
[Unit]
After=b.service

这样,如果a.serviceb.service同时启用,则systemd将b.service在之后排序a.service

如果我没有误会,即使没有启用,您要问的是启动b.service时如何启动。a.serviceb.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失败也会启动。在的手册页中.unit对此进行了详细说明。


8
我相信事实与这个答案完全相反。After=website.service表示“在website.service之后执行我的部门!”。这就是文档中所解释的:“ After =确保在列出的单元完成启动后启动配置的单元”。我假设“列出的单位”是“ After =”右侧的单位。
Sindarus

“这样,如果同时启用了a.service和b.service,则systemd将在a.service之后订购b.service。”您是否是相反的意思?swap(a, b)
Mateen Ulhaq,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.