前言
本文主要演示一个 linux service 的例子:一个服务依赖于另外的服务,当所依赖的服务发生异常,当前服务将尝试重启。重启方式为:在指定时间内,每间隔特定的时间进行重启,并且设置最大重启次数。
一、重启的关键字
重启检测限制
1. StartLimitInterval=设置限制时长,10秒,在system.conf下的DefaultStartLimitInterval是表示其默认值
2. StartLimitBurst=设置次数,5次,在system.conf下的DefaultStartLimitBurst是表示其默认值
3. 默认值为10秒内允许启动5次
4. 若需要某个服务单独设置的话,则在服务中的[service]标签下设置StartLimitIntervalSec和StartLimitBurst
分别为需要设置的时间和次数
服务重启
5. 在服务进行结束后,服务会自动的将其重启,比如说在服务被人为手动的kill后,或者服务崩溃导致进程结束等等原因时,
服务会将其自动重启,避免需要人为的实时去手动重启的局面,便于维护。
二、重启语句的解释
设置单元的启动频率限制。
也就是该单元在 interval 时间内最多允许启动 burst 次。
这俩的默认值都在systemd 配置文件(system.conf)中
StartLimitIntervalSec=interval
StartLimitBurst=burst
设置在重启服务(Restart=)前暂停多长时间。 默认值是100毫秒(100ms)。
如果未指定时间单位,那么将视为以秒为单位。 例如设为"10"等价于设为"10s"。
RestartSec=10
当服务进程 正常退出、异常退出、被杀死、超时的时候, 是否重新启动该服务。 所谓"服务进程" 是指 Exec*= 中设置的进程。
当进程是由于 systemd 的正常操作(例如 systemctl stop|restart)而被停止时, 该服务不会被重新启动。
所谓"超时"可以是看门狗的"keep-alive ping"超时, 也可以是 systemctl start|reload|stop 操作超时。
该值可以为no, on-success, on-failure, on-abnormal, on-watchdog, on-abort, always 之一。
no(默认值) 表示不会被重启。 always 表示会被无条件的重启。
Restart=always
启动服务时等待的秒数,这一配置对于使用 Docker 容器而言显得尤为重要,
因其第一次运行时可能需要下载镜像,严重延时会容易被 Systemd 误判为启动失败杀死。
通常,对于这种服务,将此值指定为 0,从而关闭超时检测
TimeoutStartSec=
停止服务时的等待秒数,如果超过这个时间仍然没有停止,Systemd 会使用 SIGKILL 信号强行杀死服务的进程
TimeoutStopSe=
三、应用示例
服务运用的脚本程序:
root@admin:/home/admin# cat /usr/bin/test.sh
#!/bin/sh
while true
do
cmd=`systemctl is-active pmon`
ret=`echo $cmd | awk '{print $0}'`
# 依赖的服务不存在, 当前脚本就退出
if [ $ret = "inactive" ];then
echo "#### docker pmon error ####"
exit 1
fi
echo "#### hello world ####"
sleep 1
done
root@admin:/home/admin#
当前服务的内容:
root@admin:/home/admin# systemctl cat my.service
# /lib/systemd/system/my.service
[Unit]
Description=Open my service
After=pmon.service
[Service]
ExecStart=/usr/bin/test.sh
ExecStop=/bin/echo "#### stop my.service! ####"
ExecStopPost=/bin/echo "#### good bye ####"
StartLimitInterval=600
StartLimitBurst=60
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
Alias=myhello.service
root@admin:/home/admin#
验证所依赖的服务不存在,当前服务是否能不断地重启:
可以看到,当时间来到10秒左右的时候,服务的状态由 Active: activating (auto-restart)
变成了 Active: active
,表明服务确实在时间间隔 RestartSec=10
的时候进行了重启。
Main PID: 1119704 (code=exited, status=1/FAILURE)
root@admin:/home/admin# systemctl status my.service
● my.service - Open my service
Loaded: loaded (/lib/systemd/system/my.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Tue 2022-03-22 20:39:23 UTC; 8s ago
Process: 1119704 ExecStart=/usr/bin/test.sh (code=exited, status=1/FAILURE)
Process: 1119709 ExecStopPost=/bin/echo #### good bye #### (code=exited, status=0/SUCCESS)
Main PID: 1119704 (code=exited, status=1/FAILURE)
root@admin:/home/admin#
root@admin:/home/admin# systemctl status my.service
● my.service - Open my service
Loaded: loaded (/lib/systemd/system/my.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Tue 2022-03-22 20:39:23 UTC; 9s ago
Process: 1119704 ExecStart=/usr/bin/test.sh (code=exited, status=1/FAILURE)
Process: 1119709 ExecStopPost=/bin/echo #### good bye #### (code=exited, status=0/SUCCESS)
Main PID: 1119704 (code=exited, status=1/FAILURE)
root@admin:/home/admin# systemctl status my.service
● my.service - Open my service
Loaded: loaded (/lib/systemd/system/my.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-03-22 20:39:33 UTC; 2ms ago
Main PID: 1119986 (test.sh)
Tasks: 1 (limit: 9374)
Memory: 128.0K
CGroup: /system.slice/my.service
├─1119986 /bin/sh /usr/bin/test.sh
└─1119987 systemctl is-active pmon
Mar 22 20:39:33 admin systemd