如何实现脚本监控:检测“script dead”输出并重启挂起的myscript
解决myscript挂起时的自动重启问题
你可以通过捕获myscript的输出、匹配特定关键词来检测挂起状态,然后主动杀死进程并重启。以下是两种可靠的实现方式:
方法一:使用Bash Coproc(推荐,兼容性好)
Coproc是Bash 4.0+支持的特性,能方便管理子进程并捕获其输出:
while true; do # 启动myscript,用coproc管理子进程,同时将stderr重定向到stdout coproc MYPROC { myscript 2>&1; } # 读取myscript的输出内容 while read -r line <&"${MYPROC[0]}"; do # 可选:转发原输出到终端,方便实时查看 echo "$line" # 检测是否出现挂起标记 if [[ "$line" == *"script dead"* ]]; then # 杀掉挂起的myscript进程 kill "${MYPROC_PID}" echo "[监控脚本] 检测到'script dead',已终止myscript (PID: ${MYPROC_PID})" >&2 break fi done # 等待子进程彻底退出,避免产生僵尸进程 wait "${MYPROC_PID}" 2>/dev/null echo "[监控脚本] myscript已退出,1秒后重启..." >&2 sleep 1 done
关键说明:
coproc MYPROC { myscript 2>&1; }:将myscript的错误输出重定向到标准输出,确保能捕获所有内容;coproc会自动记录子进程ID到MYPROC_PID变量。[[ "$line" == *"script dead"* ]]:模糊匹配输出行中的关键词,若需要精确匹配,可去掉前后的通配符*。kill "${MYPROC_PID}":匹配到挂起标记后,立即终止myscript进程。
方法二:基于/proc文件系统(仅Linux适用)
如果你的环境不支持coproc,可借助Linux的/proc文件系统直接读取进程输出:
while true; do # 启动myscript后台运行,记录进程ID myscript & MYPID=$! # 同时捕获stdout和stderr的输出内容 tail -q -f "/proc/${MYPID}/fd/1" "/proc/${MYPID}/fd/2" 2>/dev/null | while read -r line; do echo "$line" if [[ "$line" == *"script dead"* ]]; then kill "${MYPID}" echo "[监控脚本] 检测到挂起,已终止myscript (PID: ${MYPID})" >&2 break fi done # 等待进程退出,忽略进程已被杀死的报错 wait "${MYPID}" 2>/dev/null echo "[监控脚本] 准备重启myscript..." >&2 sleep 1 done
注意事项:
- 该方式仅适用于Linux系统,依赖
/proc文件系统,macOS等其他Unix-like系统无法使用。 tail -q -f会持续读取进程的文件描述符,直到进程被终止。
内容的提问来源于stack exchange,提问作者supra
相关产品推荐
相关产品推荐

