# Systemd 按情况自动重启服务

> 来源：梦飞idc云平台 | 原文：https://www.mfisp.com/26065.html | 发布：2023-12-15 | 更新：2023-12-15 | 分类：运维技术

前言

 

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 不会自动重启，就需要考虑到。有些复杂，需要慢慢理解。

---
本页由 梦飞idc云平台（https://www.mfisp.com）提供。站点导航见 https://www.mfisp.com/llms.txt
