最近有个需求,监控某个守护进程,如果进程不存在,则重启这个进程,打算写一个 bash 脚本和 service 服务满足这个需求。
看到 stackoverflow的高赞回答后,不知道这样写的脚本是不是合适的,有没有更加好实践。
我对 stackoverflow 高赞回答表示怀疑,其中jobs -p
,无法列出后台的守护进程。因为一般编写守护进程代码时,都是 fork 两次并重新设置会话 setsid
trap 'kill $(jobs -p)' EXIT; until myserver & wait
#!/bin/bash
this_bash_pid=$$
exe_name="thisIsExample"
# 定义一个函数来杀死进程
kill_process() {
if [ -n "${PID}" ]; then
kill -9 ${PID}
fi
exit
}
# 使用 trap 命令捕获 TERM, INT 和 EXIT 信号
trap 'kill_process' TERM INT EXIT
while true
do
output=$(ps -ef | grep ${exe_name} | grep -v grep | grep -v ${this_bash_pid})
if [ $? -eq 0 ];then
PID=$(echo $output | awk '{print $2}')
echo "${exe_name} :${PID} is running"
else
./${exe_name} &
output=$(ps -ef | grep ${exe_name} | grep -v grep | grep -v ${this_bash_pid})
echo $output
PID=$(echo $output | awk '{print $2}')
echo $PID
fi
sleep 1
done
monitor_process.service
[Unit]
Description=Monitor Process Service
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/local/bin/monitor_process.sh
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.