
最近有个需求,监控某个守护进程,如果进程不存在,则重启这个进程,打算写一个 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 1 ysc3839 2024-04-28 20:50:34 +08:00 via Android 为什么不直接用 systemd 启动目标进程? |
4 ysc3839 2024-04-28 21:52:52 +08:00 via Android @wisefree systemd 怎么不能自动重启?你自己发的配置文件里就写了 Restart=on-failure 呀,不能自动重启的话,你写来干嘛? |
6 wisefree OP @ysc3839 我再搜下 systemd ,确实不太懂这个,临时想出的 bash 脚本,然后用 chatgpt 写了一个服务 |