You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确停止配置了管道命令的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:18:00