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

如何实现脚本监控:检测“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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:02:08