我在线搜索并在这里发布以了解如何使用 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-success
、on-failure
、on-abnormal
、on-watchdog
、on-abort
或之一always
。[…] 在此上下文中,干净退出意味着退出代码为0
,或信号SIGHUP
、SIGINT
、SIGTERM
或之一SIGPIPE
,以及 中指定的退出状态和信号SuccessExitStatus=
。如果设置为on-failure
,则当进程以非零退出代码退出、由信号终止(包括核心转储,但除上述四个信号外)、某个操作(例如服务重新加载)超时以及触发配置的看门狗超时时。
(来源)
kill
默认发送SIGTERM
。这就是为什么服务在您终止后不会自行重新启动的原因。
如果应用程序崩溃,我该如何修复此脚本以自动重新启动应用程序?
如果应用程序在这种情况下返回非零退出状态,则无需修复。服务将重新启动。
我怎样才能测试它是否正常工作而不等待它崩溃?
杀死它
SIGQUIT
或者SIGKILL
:kill -s SIGQUIT $pid
或者您可以使用
RestartForceExitStatus=SIGTERM
让服务在 之后自行重启SIGTERM
。但请注意,kill $pid
随后会测试其是否RestartForceExitStatus=
有效,而不是完全有效Restart=
。或者您可以(暂时)修改,使其在接收后或几秒后
/home/pi/app1
以非零退出状态退出。发送给进程或只是等待,然后轮询以查看发生了什么。SIGUSR1
SIGUSR1
systemctl 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