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

What is the difference between systemd's 'oneshot' and 'simple' service types?

systemd服务Typeoneshotsimple有什么区别? 此 link 声明使用 simple 而不是 oneshot 作为计时器。我无法正确理解它。

Type=oneshot服务单位:

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

  • 一旦第一个进程退出,从 "activating" 直接过渡到 "inactive",除非 RemainAfterExit=true 被设置(在这种情况下它变成 "active"没有进程!);

  • 可能有任意数量(0 个或更多)的 ExecStart= 指令将按顺序执行(等待每个启动的进程退出,然后再启动下一个进程);

  • 可能会遗漏 ExecStart= 但有 ExecStop=(与 RemainAfterExit=true 一起用于在系统关闭时将事情安排到 运行)。

Type=simple服务单位:

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

  • 一旦第一个进程退出,从"active"过渡到"inactive"(没有RemainAfterExit=选项);

  • 通常不被鼓励,因为无法区分 "exited on start because of a configuration error" 和 "crashed after 500ms of runtime" 等情况。

Type=oneshotType=simple单位:

  • 忽略第一个进程的任何子进程,所以不要将这些模式与分叉进程一起使用(注意:您可以将 Type=oneshotKillMode=none 一起使用,但只有在以下情况下才这样做你知道你在做什么).

从 systemd 的角度来看,Type=simple 是一劳永逸。 Systemd 只是派生一个在 ExecStart= 中定义的进程并继续运行,即使该进程无法启动。