【问题标题】:What is the difference between systemd's 'oneshot' and 'simple' service types?systemd 的“oneshot”和“simple”服务类型有什么区别?
【发布时间】:2016-12-26 04:55:18
【问题描述】:

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

【问题讨论】:

    标签: systemd


    【解决方案1】:

    Type=oneshot服务单位:

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

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

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

    • 可以省略ExecStart=,但有ExecStop=(与RemainAfterExit=true 一起用于安排在系统关闭时运行)。

    Type=simple服务单位:

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

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

    • 通常不鼓励使用,因为无法区分“由于配置错误而在启动时退出”和“运行 500 毫秒后崩溃”等情况。

    Type=oneshotType=simple 单位:

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

    【讨论】:

    • intelfx 说Type=oneshot 服务单元“不能有ExecStart=”。这不是真的。事实上,oneshot 类型的服务可以有多个 ExecStart= 指令。有关更多信息,请参阅 systemd.service 的任何最新手册页。
    • @rlandster:为什么这是“不正确的”? systemd.service(5)ExecStart= 下说:“除非 Type= 是 oneshot,否则必须给出一个命令。使用 Type=oneshot 时,可以指定零个或多个命令。”
    • 同意“可以没有”令人困惑。那不是真的。但我认为你不能拥有ExecReload
    • “不能有”我认为@intelfx 的意思是“可以有零个或多个”或“不需要一个”,而不是“不能有任何”。但是,为了清晰起见重新措辞将有助于未来的读者。
    • “甚至可以没有”也许是更好的措辞
    【解决方案2】:

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

    【讨论】:

    • Type=simple 进程仍由 systemd 监控,并将根据 Restart 设置的值重新启动。
    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2010-10-02
    • 2018-12-05
    • 2018-01-09
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多