我在这里的问题是了解basic.target
启动我的 CentOS 7 服务器时的情况。
我认为我对 Systemd 的了解是正确的:
Requires=unit2
意味着有些只有在全部成功的情况unit1
下才会被激活unit2
Wants=unit2
表示unit1
无论列出的unit2是否成功,某些都会被激活After=unit2
意味着有些unit1
只有在unit2激活后才会激活Systemd 中的事物通常是并行开始的
.target
主要用于“分组”和“排序”(参见systemd.目标)实际上,必须在达到(这是服务器的默认运行级别)
basic.target
之前激活(以及它所需和想要的一切)multi-user.target
好吧,我希望到目前为止我是对的。
现在,寻找basic.target
:
$ sudo cat /usr/lib/systemd/system/basic.target
[Unit]
Description=Basic System
Documentation=man:systemd.special(7)
Requires=sysinit.target
After=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
After=sockets.target paths.target slices.target
所以现在我的解释是:
basic.target
只会被激活后sysinit.target
已经成功了此外,
basic.target
希望能够sockets.target
跑步等附加
After=
手段,好吧,请basic.target
在sockets.target
、paths.target
、激活后才slices.target
激活。timers.target
失败也没关系。那么为什么不将两者合而为一
After=
呢?为什么不使用Require=
代替Wants
(除了timers.target
)?
答案1
你在第 4 点中的问题很突出,其余的作为背景。
为什么不将两者合二为一
After=
呢?
没有任何技术原因阻止两个After=
指令的组合。After=
、Wants=
、 和中的单位顺序Requires=
无关紧要;它们甚至可以来自不同的文件(例如覆盖),并且仍然会被加入到一个集合中进行检查。因此,是否合并的决定可以基于可读性和模板易用性等因素。
为什么不使用
Require=
代替Wants=
(除了timers.target
)?
触发目标启动,但basic.target
如果某些依赖目标失败则不会失败。
这与 相反Requires=sysinit.target
,它将触发sysinit.target
启动并在失败basic.target
时失败sysinit.target
。
和Requires=
都会Wants=
触发依赖单元的启动
(这将触发他们的需求和需求,从树上层叠下来)。区别在于如果所需的服务无法启动会发生什么情况。如果某个服务丢失或无法启动,则Requires=
该服务的所有服务也将无法启动。但是,Wants=
失败的服务仍然会启动。例如,如果在当前配置中由于任何原因而失败,paths.target
仍然可以使用 来访问,但不能使用 来访问。slices.target
basic.target
Wants=
Requires=
After=
另一方面,仅指定启动顺序。
考虑 asome.service
没有After=postres.service
和Wants=
,但系统中Requires=
没有。postgres.service
将some.service
照常开始,忽略丢失的postres.service
.如果postres.service
在系统中,但无法启动,some.service
将等待尝试postres.service
启动,然后无论如何启动。
启用与否some.service
并不重要。如果未启用,当您手动启动它时,它将启动而不会尝试启动postres.service
。
添加Requires=postres.service
或Wants=postres.service
tosome.service
将导致在以任何方式postres.service
启动时也启动。some.service
如果postres.service
为Requires=
,则其启动失败也会导致some.service
启动失败。
如果您只指定Requires=
without After=
,我不完全确定。我的猜测是systemd
会同时启动它们,失败postres.service
将不起作用。
** 但我确信有一种情况:如果some.service
您只指定Requires=postres.service
without After=postres.service
,但postres.service
系统中缺少 ,则任何启动尝试some.service
都将失败。
这就是为什么当您想要确保一项服务在启动另一项服务之前成功启动时,通常会同时使用Requires=
和。After=