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

如何等待非子进程且不阻塞信号陷阱处理器?

等待非子进程且响应信号的Shell方案

核心解决方案:用read -t替代sleep

原生Shell环境下,read -t 1可以替代sleep 1解决信号阻塞问题——read在等待超时期间会响应信号,不会像sleep那样阻塞信号处理器,能让脚本及时处理SIGINT、SIGTERM等停止信号。

具体实现代码:

trap 'exit 0' INT TERM  # 定义信号处理逻辑,收到INT/TERM时立即退出
while kill -0 "$PID" 2>/dev/null; do
    read -t 1 || true  # 等待1秒,收到信号会立即终止等待
done

代码说明

  • kill -0 "$PID":仅检查进程是否存活,不发送任何信号,返回状态码0表示进程存在,非0表示已结束,比检查/proc/$PID兼容性更强(部分环境可能无/proc文件系统)。
  • read -t 1:设置1秒超时等待,若期间收到信号会立即返回非0状态码,|| true确保循环不会因read的非0状态提前退出,仅在kill -0检测到进程结束时终止循环。
  • trap语句:显式绑定信号处理,保证收到停止信号时脚本能立刻响应退出。

备选方案:使用inotifywait(需额外工具)

如果系统已安装inotify-tools,可以监听/proc/$PID目录的删除事件,无需轮询就能在进程结束时立即响应,同时正常处理信号:

trap 'exit 0' INT TERM
if [ -d "/proc/$PID" ]; then
    inotifywait -e delete_self "/proc/$PID" >/dev/null 2>&1
fi

该方案无轮询延迟,但依赖外部工具,仅适用于已安装inotify-tools的Linux环境。


内容的提问来源于stack exchange,提问作者Maestro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:29:55