启动后了解 Systemd basic.target

启动后了解 Systemd basic.target

我在这里的问题是了解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

所以现在我的解释是:

  1. basic.target只会被激活 sysinit.target已经成功了

  2. 此外,basic.target希望能够sockets.target跑步等

  3. 附加After=手段,好吧,请basic.targetsockets.targetpaths.target、激活后才slices.target激活。timers.target失败也没关系。

  4. 那么为什么不将两者合而为一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.targetbasic.targetWants=Requires=

After=另一方面,仅指定启动顺序。

考虑 asome.service没有After=postres.serviceWants=,但系统中Requires=没有。postgres.servicesome.service照常开始,忽略丢失的postres.service.如果postres.service在系统中,但无法启动,some.service将等待尝试postres.service启动,然后无论如何启动。

启用与否some.service并不重要。如果未启用,当您手动启动它时,它将启动而不会尝试启动postres.service

添加Requires=postres.serviceWants=postres.servicetosome.service将导致在以任何方式postres.service启动时也启动。some.service如果postres.serviceRequires=,则其启动失败也会导致some.service启动失败。

如果您只指定Requires=without After=,我不完全确定。我的猜测是systemd会同时启动它们,失败postres.service将不起作用。

** 但我确信有一种情况:如果some.service您只指定Requires=postres.servicewithout After=postres.service,但postres.service系统中缺少 ,则任何启动尝试some.service都将失败。

这就是为什么当您想要确保一项服务在启动另一项服务之前成功启动时,通常会同时使用Requires=和。After=

相关内容