Systemd 按情况自动重启服务

前言

systemd服务异常自动重启很好用,但有的时候希望某些服务只在特定情况下进行重启,其他时候不要自动重启(比如OOM,需要人工介入)。
本文抛砖引玉,旨在能够让读者对systemd的重启机制有一定了解。

自动重启范例

[Unit]
Description=mytest

[Service]
Type=simple
ExecStart=/root/mytest.sh
Restart=always
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

参数详解

Restart=always: 只要不是通过systemctl stop来停止服务,任何情况下都必须要重启服务,默认值为no
RestartSec=5: 重启间隔,比如某次异常后,等待5(s)再进行启动,默认值0.1(s)
StartLimitInterval: 无限次重启,默认是10秒内如果重启超过5次则不再重启,设置为0表示不限次数重启

RestartPreventExitStatus参数

查询man systemd.service发现,systemd的[Service]段落里支持一个参数,叫做RestartPreventExitStatus。该参数从字面上看,意思是当符合某些退出状态时不要进行重启。该参数的值支持exit code和信号名2种,可写多个,以空格分隔,例如:

RestartPreventExitStatus=143 137 SIGTERM SIGKILL

表示,当退出情况只要符合以下4种情况中任意一种时候,则不再进行重启

exit code为143
exit code为137
信号为TERM
信号为KILL

注意事项

RestartPreventExitStatus与Restart的关系

配置RestartPreventExitStatus=后,并没有完全忽略Restart=,而是指当退出情况与RestartPreventExitStatus=匹配的时候,才忽略Restart=,若没有匹配,根据Restart=该怎么样还怎么样(具体详见后面的扩展部分)

kill子进程会是什么情况

若systemd启动的不是一个简单进程,而是会派生子进程的情况(比如执行shell脚本,shell脚本里启动多个程序),那么当另外开一个窗口通过kill -信号测试时,会是什么情况呢,测试方法如下:

ExecStart=/root/mem改为ExecStart=/root/mytest.sh

/root/mytest.sh内容为

#!/bin/bash
sleep 100000 &
sleep 200000

总结

Systemd在某些进程维护上还是很方便的,自动重启在很多业务上是有需求的,比如服务器。但是需要自己做简单测试才能判断出来正确状况。比如很多时候 kill -9 不会自动重启,就需要考虑到。有些复杂,需要慢慢理解。

文章链接: https://www.mfisp.com/26065.html

文章标题:Systemd 按情况自动重启服务

文章版权:梦飞科技所发布的内容,部分为原创文章,转载请注明来源,网络转载文章如有侵权请联系我们!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
运维技术

Linux下通过命令连接wifi

2023-12-14 16:06:00

运维技术

Ubuntu 18+ 如何配置网络

2023-12-18 11:05:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
客户经理
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索

梦飞科技 - 最新云主机促销服务器租用优惠