systemd的“oneshot”和“simple”服务类型有什么区别?

87
什么是 systemd 服务中的 Type oneshotsimple 的区别?这个链接建议在定时器中使用 simple 而不是 oneshot,我无法正确理解它。
2个回答

105

Type=oneshot 服务单元:

  • 在启动操作时阻塞,直到第一个进程退出,并且其状态将报告为 "正在激活"(activating);

  • 一旦第一个进程退出,如果未设置 RemainAfterExit=true,则从 "正在激活" 直接转换为 "停止"(inactive)状态(如果设置了,则会变为 "活动"(active)状态,但没有任何进程!);

  • 可以有任意数量(0 或更多个)的 ExecStart= 指令,这些指令将按顺序执行(在开始下一个进程之前等待每个已启动的进程退出);

  • 可以省略 ExecStart=,但是可以有 ExecStop=(与 RemainAfterExit=true 结合使用,用于安排在系统关机时运行的内容)。

Type=simple 服务单元:

  • 不会在启动操作上阻塞(即在分叉出第一个进程后立即变为 "活动"(active)状态,即使它仍在初始化!);

  • 一旦第一个进程退出,就会从 "活动" 转换为 "停止"(inactive)状态(没有 RemainAfterExit= 选项);

  • 通常不建议使用此类型,因为无法区分诸如 "由于配置错误在启动时退出" 和 "在运行500ms 后崩溃" 等情况。

Type=oneshotType=simple 单元都:

  • 会忽略第一个进程的任何子进程,因此不要与分叉进程一起使用这些模式(注意:您可以使用 Type=oneshotKillMode=none,但是只有在确定知道自己在做什么时才可以这样做)。

2
intelfx表示,Type=oneshot服务单元“不能有ExecStart=”。这是不正确的。事实上,类型为oneshot的服务可以有多个ExecStart=指令。有关更多信息,请参阅任何最近的systemd.service手册页面。 - rlandster
2
@rlandster:为什么这个说法“不正确”?systemd.service(5)ExecStart=下述道:“除非Type=是oneshot,否则必须给出一个命令。当使用Type=oneshot时,可以指定零个或多个命令。” - intelfx
1
同意“可以没有”这个说法很令人困惑。这并不是真的。但我认为你不能有ExecReload - Tony
7
“can have no”在这里的意思是“可以有零个或更多”,或者说“不需要一个”,而不是“不能有任何”。然而,重述一下以便让未来的读者更加清楚明白会更有帮助。 - seh
1
也许更好的措辞是“可以没有”。 - Manchineel

1
从systemd的角度来看,Type = simple有点像是点火然后忘记。即使进程启动失败,systemd也只是分叉在ExecStart=中定义的进程并继续执行。

27
“Type=simple” 进程仍然受 systemd 监控,根据“Restart”设置的值进行重新启动。 - ldx.a.ldy.c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接