我有一个 systemdfw.service
单元文件,需要networking.service
:
# systemctl show networking -p Requires
Requires=system.slice fw.service
#
当networking.service
处于该active
状态并且我执行systemctl stop fw
然后几秒钟后systemctl start fw
,则networking.service
保持该inactive (dead)
状态。但是,当networking.service
处于active
状态并且我执行systemctl restart fw
时,networking.service
也会重新启动。
这是预期的行为吗?我认为systemctl restart
基本上是systemctl stop
跟着systemctl start
,因此systemctl start
也应该启动networking.service
.
restart
类似于stop
+start
,但不相同。 服务管理器restart
内部对作业的处理方式不同。systemd
这不是systemctl
界面中简单的便利功能。[*]查看此特定行为,当前版本的
man systemd.unit
. (至少在我的安装中systemd-239
)。的行为
stop
已记录在案。并且行为start
也与文档一致。没有明确记录的是传播restart
到需要的单元fw.service
。但是,我在另一种依赖类型中看到了关于它的提示:提示是 if
PartOf=
是Requires=
, then的一个有限子集,它Requires=
会做所有的事情PartOf=
。所以这包括传播重启。如果
networking.service
不想在第一步中停止,您可以替换Requires=fw.service
为Wants=fw.service
. 但我认为Requires=
是故意使用的,以确保您在防火墙规则未激活的情况下永远不会激活您的网络。您可能希望重新启动是按顺序排列的,这样
networking.service
在没有激活的情况下永远不会fw.service
被激活,假设它也设置了After=fw.service
......我还没有确认这是实际发生的情况。(如果这是您的希望,我建议您根据此答案以外的其他权威来验证它:-)。如果你真的想,我想你可以设置
Wants=networking.service
,fw.service
即使networking.service
有Requires=fw.service
。这是可能的,因为这些依赖关系并不意味着特定的顺序。我认为,如果您的排序依赖项(After=
和Before=
设置)有冲突,您只会遇到“依赖循环”的问题。[*] 例如
systemd-logind
旨在可重新启动,并安排systemd
在重新启动期间保持某些关键文件处于打开状态。但是如果你只stop
登录,打开的文件就会丢失。(AFAIK 重新启动 systemd-logind 仍然会破坏 Xorg 或 Wayland 的每个当前版本,但您可以看到systemd
代码处理restart
方式不同的想法:-P)。