Systemd Service Type oneshot和simple之间有什么区别

Din*_*.R. 35 systemd

systemd服务Type oneshot和有simple什么区别?此链接表示使用simple而不是oneshot计时器.我无法正确理解它.

int*_*lfx 53

Type=oneshot服务单位:

  • 阻止启动操作直到第一个进程退出,其状态将报告为"激活";

  • 一旦第一个进程退出,从"激活"直接转换为"非活动",除非RemainAfterExit=true设置(在这种情况下它变为"活动"而没有进程!);

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

  • 可能会遗漏ExecStart=但是ExecStop=(有RemainAfterExit=true用于安排在系统关闭时运行的东西).

Type=simple服务单位:

  • 不会阻止启动操作(即在分离第一个进程后立即变为"活动",即使它仍在初始化!);

  • 一旦第一个进程退出,从"活动"转换为"非活动"(没有RemainAfterExit=选项);

  • 通常不鼓励因为没有办法区分"由于配置错误而在启动时退出"和"运行500ms后崩溃"等情况.

两者Type=oneshotType=simple单位:

  • 忽略第一个过程的任何孩子,所以不分叉过程中使用这些模式(注:你可以使用Type=oneshotKillMode=none,但只做到这一点,如果你知道你在做什么).

  • “可以没有”我认为@intelfx 的意思是“可以有零个或多个”,或者“不需要一个”,而不是“不能有任何”。但是,为了清楚起见重新措辞将有助于未来的读者。 (7认同)
  • intelfx 表示 `Type=oneshot` 服务单元“可以没有 `ExecStart=`”。这不是真的。事实上,“oneshot”类型的服务可以有多个“ExecStart=”指令。有关更多信息,请参阅最近的“systemd.service”手册页。 (2认同)
  • @rlandster:为什么这“不是真的”?[systemd.service(5)](https://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=) 在 `ExecStart=` 下说:“除非 Type= 是 oneshot,否则就是一个必须给出命令。当使用 Type=oneshot 时,可以指定零个或多个命令。” (2认同)