如果服务崩溃,则无法让 systemd 重新启动服务

如果服务崩溃,则无法让 systemd 重新启动服务

我在线搜索并在这里发布以了解如何使用 systemd 自动启动 c++ 应用程序,现在我希望它在崩溃时自动重新启动该应用程序。

我知道正确的做法是让应用程序不崩溃,但这不是我的程序可以改变的

以下是我目前收集到的信息:

https://singlebrook.com/2017/10/23/auto-restart-crashed-service-systemd/

和这里: 编写一个在 Linux 中启动 2 个应用程序的 systemd 脚本

使用以下命令创建文件/etc/systemd/system/app1.service

[Unit]
Description=app1 systemd service.

[Service]
Type=simple
ExecStart=/home/pi/app1
RemainAfterExit=no
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

然后执行启用服务

sudo systemctl enable app1.service

该服务最初启动,但是当我执行

sudo kill xx其中 xx 是应用程序的 pid,它不会自行重启

如果应用程序崩溃,我该如何修复此init.d脚本以自动重新启动应用程序?

或者说如果我杀掉它它就不能工作了sudo kill?在这种情况下,我如何才能在不等待它崩溃的情况下测试它是否正常工作?

谢谢

答案1

这就是Restart=on-failure[强调我的]:

Restart=

配置当服务进程退出、被终止或超时时是否重新启动服务。[…]

no取、on-successon-failureon-abnormalon-watchdogon-abort或之一always。[…] 在此上下文中,干净退出意味着退出代码为0,或信号SIGHUPSIGINTSIGTERM或之一SIGPIPE,以及 中指定的退出状态和信号SuccessExitStatus=。如果设置为on-failure,则当进程以非零退出代码退出、由信号终止(包括核心转储,但除上述四个信号外)、某个操作(例如服务重新加载)超时以及触发配置的看门狗超时时。

来源

kill默认发送SIGTERM。这就是为什么服务在您终止后不会自行重新启动的原因。

如果应用程序崩溃,我该如何修复此脚本以自动重新启动应用程序?

如果应用程序在这种情况下返回非零退出状态,则无需修复。服务将重新启动。

我怎样才能测试它是否正常工作而不等待它崩溃?

  1. 杀死它SIGQUIT或者SIGKILL

    kill -s SIGQUIT $pid
    
  2. 或者您可以使用RestartForceExitStatus=SIGTERM让服务在 之后自行重启SIGTERM。但请注意,kill $pid随后会测试其是否RestartForceExitStatus=有效,而不是完全有效Restart=

  3. 或者您可以(暂时)修改,使其在接收后或几秒后/home/pi/app1以非零退出状态退出。发送给进程或只是等待,然后轮询以查看发生了什么。SIGUSR1SIGUSR1systemctl status app1.service

答案2

轻松修复

它需要分叉类型和 pid 文件,这将与sudo kill命令一起工作,谢谢,

[Unit]
Description=app1 systemd service.

[Service]
Type=simple
ExecStart=/home/pi/fbcp-ili9341
RemainAfterExit=no
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

相关内容