如何正确停止配置了管道命令的supervisor进程及所有关联子进程
supervisor停止日志推送任务后关联进程残留的解决方法
问题原因
你当前配置中用bash -c启动带管道的命令,supervisor默认仅终止它直接拉起的bash父进程,不会自动处理管道产生的tail、telegram_log.sh子进程,这些子进程会被系统1号进程托管,因此停止任务后仍会残留运行。
临时清理现有残留进程
执行以下命令直接清理当前已残留的进程:
pkill -f "telegram_log.sh nginx" pkill -f "tail -f /var/log/nginx/error.log"
永久修复方案
1. 修改supervisor配置
在你的原有配置中新增进程组停止相关参数,让supervisor终止任务时杀掉整个进程组的所有子进程:
[program:telegram-log-nginx] process_name=%(program_name)s_%(process_num)02d command=bash -c 'tail -f /var/log/nginx/error.log | /usr/share/telegram_log.sh nginx' autostart=true autorestart=true numprocs=1 # 新增以下配置 stopasgroup=true killasgroup=true stopsignal=TERM stopwaitsecs=5
修改完成后执行以下命令加载新配置即可生效:
supervisorctl update
后续再执行supervisorctl stop telegram-log-nginx:*就会自动终止所有关联进程,不会再有残留。
2. 可选优化:给shell脚本加信号处理
可以在telegram_log.sh开头添加信号处理逻辑,收到停止信号时主动退出,避免进程卡住:
#!/bin/bash # 新增信号捕获,收到终止信号时直接退出 trap 'exit 0' SIGTERM SIGINT SIGQUIT CHATID="chat" KEY="key" SERVICE=$1 TIME="10" URL="https://api.telegram.org/bot$KEY/sendMessage" while IFS= read -r line; do read -r -d '' TEXT <<- EOM Service: $SERVICE $line EOM curl -s --max-time $TIME -d "chat_id=$CHATID&disable_web_page_preview=1&text=$TEXT" $URL >/dev/null done
内容的提问来源于stack exchange,提问作者Xenro
相关产品推荐
相关产品推荐

