![如果 After=/Requires= 中的依赖项不存在,systemd 是否会失败?](https://linux22.com/image/766240/%E5%A6%82%E6%9E%9C%20After%3D%2FRequires%3D%20%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E9%A1%B9%E4%B8%8D%E5%AD%98%E5%9C%A8%EF%BC%8Csystemd%20%E6%98%AF%E5%90%A6%E4%BC%9A%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
我有一项服务 A,它在有限数量的环境中运行,用于为主机配置一些文件。我还有另一项服务 B,它在所有环境中运行。如果它们都在同一环境中运行,我希望 B 依赖于 A(并且仅在 A 之后启动)。
我认为只需根据答案在 B 中添加一个After=A
andRequires=A
这里
After
仅检查单位是否已经激活,并不明确激活指定的单位。- 列出的单元
Requires
与该单元一起激活。如果任何所需单元启动失败,则该单元不会被激活。
这似乎表明,这两个,After=
和Requires=
,都是需要的,以确保在之前启动依赖关系这(二)单位。
但是,如果指定的单元不存在,即在服务 A 未运行的环境中,会发生什么情况?依赖项是否无效?
答案1
至少从 systemd v219 开始:
- 当 A 不存在时,向 B添加
After=A
是无害的;B 仍将启动。 - 添加
Requires=A
到 B 是基本上无害当 A 不存在时;当 B 启动时,您会在日志中收到一条消息,内容如下:“无法为单元 b.service 添加依赖作业,忽略:未找到单元。”但 B 仍将启动。
- 如果服务 A 是“简单”类型(默认),则 systemd 会在 ExecStart 进程分叉后立即认为它已激活,即前该服务已完成其工作!
- 如果服务 A 是“分叉”类型,那么 systemd“将在父进程退出时考虑启动该单元”,这可能就是您在这种情况下想要的。