问题现象
最近遇到一个问题,自己写的进程通过system配置了服务,有时会发现服务停掉了,查看状态为activating , 经过研究是因为 pid 文件的存在(/var/run/myprocess.pid)导致无法启动
[root@localhost ~]# systemctl status myprocess
● myprocess.service - aaa
Loaded: loaded (/usr/lib/systemd/system/myprocess.service; enabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since 二 2022-09-20 13:22:36 CST; 313ms ago
Process: 114179 ExecStart=/usr/bin/myprocess (code=exited, status=1/FAILURE)
Main PID: 112360 (code=killed, signal=KILL)
9月 20 13:22:36 localhost.localdomain systemd[1]: Unit myprocess.service entered failed state.
9月 20 13:22:36 localh
ost.localdomain systemd[1]: myprocess.service failed.
解决方案
如何解决这个问题呢,利用 system 的 ExecStartPre 参数,增加一个脚本,在 ExecStart 执行该脚本即可,脚本逻辑是,如果 pid 问题存在就杀死原进程,并删除pid文件即可。
[Unit]
Description=aaa
After=network.target
[Service]
Type=forking
User=root
Group=root
ExecStartPre=/usr/local/bin/clean_pidid.sh ### 增加该行
ExecStart=/usr/bin/myprocess
Restart=on-failure
RestartSec=5
WorkingDirectory=/usr/bin/
#!/bin/sh
if [ -f /var/run/myprocess.pid ];then
pid=`cat /var/run/myprocess.pid`
kill -9 $pid
rm /var/run/myprocess.pid
fi