【问题标题】:Systemd - always have a service running and reboot if service stops more than X timesSystemd - 如果服务停止超过 X 次,则始终运行服务并重新启动
【发布时间】:2017-06-14 00:02:54
【问题描述】:

我需要有一个连续运行的 systemd 服务。有问题的系统是由 Yocto 构建的嵌入式 linux。 如果服务因任何原因停止(失败或刚刚完成),应自动重新启动 如果重新启动超过 X 次,系统应该重新启动。

有哪些选项可以实现这一点?我可以想到以下两个,但似乎都不是最理想的 1) 有一个 cron 作业,它将逐字进行上述检查,并将重试次数保留在 /tmp 或其他 tmpfs 中的某处 2)让服务本身跟踪它已启动的次数(再次在某些 tmpfs 位置)并在必要时重新启动。如果服务没有运行,Systemd 将不得不不断尝试启动服务

编辑:根据答案的建议,我修改了服务以使用StartLimitAction,如下所示。它会导致设备正确重新启动,但它不会重新启动系统,即使我不断终止脚本:

[Unit]
Description=myservice system

[Service]
Type=simple
WorkingDirectory=/home/root
ExecStart=/home/root/start_script.sh

Restart=always
StartLimitAction=reboot
StartLimitIntervalSec=600
StartLimitBurst=5

[Install]
WantedBy=multi-user.target

【问题讨论】:

    标签: service cron systemd yocto


    【解决方案1】:

    你的服务文件中的这个应该非常接近你的要求:

    [Service]
    Restart=always
    
    [Unit]
    StartLimitAction=reboot
    StartLimitIntervalSec=60
    StartLimitBurst=5
    

    如果服务停止,它将重新启动服务,除非在 60 秒内重新启动超过 5 次:在这种情况下,它将重新启动。

    您可能还想查看WatchdogSec 值,但此软件看门狗功能需要服务本身的支持(不过添加非常容易,请参阅 WatchDogSec 的文档)。

    【讨论】:

    • 它似乎不起作用 - 我已经尝试杀死脚本十几次,它确实重新启动了脚本,但它永远不会重新启动系统。我可能错过了一些东西。在原问题中添加了 systemd 单元
    【解决方案2】:

    我的理解是Restart=这一行应该在[Service]中,如示例中

    但行 StartLimitxxxxx= 应该在 [Unit] 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-07
      • 2017-06-24
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多