linux下通常可以用supervisor来实现守护进程自动重启,但是centos下的系统服务是通过service或者systemctl命令启动的,启动实际调用的运行指令并不包含service或者systemctl命令,supervisor监控不到,那么应该怎么实现这部分服务的自动重启呢

其实centos的服务已经自带了方法

就是在服务脚本中加上Restart指令

我们以centos7以上为例子,centos7开始服务命令已经从service换到systemctl

首先查找某个服务的脚本

[root@ecs-ooxx systemd]# systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: active (running) since 二 2022-04-12 10:04:35 CST; 2h 7min ago
 Main PID: 3131 (mysqld_safe)

loaded那里可以看到脚本路径

[root@ecs-ooxx systemd]# vim /usr/lib/systemd/system/mariadb.service

编辑这个脚本内容,在Service下添加Restart系列的4条指令

[Unit]
Description=MariaDB database server
After=syslog.target
After=network.target

[Service]
Restart=always
RestartSec=5
StartLimitInterval=0
StartLimitBurst=5
Type=simple
User=mysql
Group=mysql

参数详解:

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

另外:

StartLimitInterval和StartLimitBurst两个参数决定了对该服务重启次数的限制

默认情况下,一个服务在10秒内最多允许启动5次。当超过5次后,会报如下错误

Job for xx.service failed because start of the service was attempted too often. See "systemctl status xxx.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed xxx.service" followed by "systemctl start xxx.service" again.

可以通过以下两个选项来设置服务启动的频率:

StartLimitIntervalSec=, StartLimitBurst=

设置单元的启动频率限制。  StartLimitIntervalSec= 用于设置时长, 默认值等于 DefaultStartLimitIntervalSec= 的值(默认为10秒),设为 0 表示不作限制。

 StartLimitBurst= 用于设置在一段给定的时长内,最多允许启动多少次, 默认值等于 DefaultStartLimitBurst= 的值(默认为5次)。 虽然此选项通常与 Restart= 一起使用, 但实际上,此选项作用于任何方式的启动(包括手动启动), 而不仅仅是由 Restart= 触发的启动。

修改完成后,需要更reload一下

[root@ecs-ooxx systemd]# systemctl daemon-reload

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐