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

如何在Shell脚本终止时调用清理函数终止后台守护进程

实现Shell脚本终止时自动清理后台进程

当然可以,Shell提供的trap命令就能实现这个需求——它能捕获脚本收到的各类终止信号,触发指定函数执行。针对你的场景,只需要把清理函数绑定到退出信号及常见终止信号即可。

完整修改后的代码

# 清理函数:终止所有后台守护进程
purge () {
  # 用"${pids[@]}"确保数组元素被正确解析(避免特殊字符问题)
  for pid in "${pids[@]}"; do
    # 优先尝试正常终止,失败再强制杀死(可根据需求调整)
    kill "$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null
    echo "终止进程 $pid"
  done
}

# 绑定信号:覆盖脚本正常退出、Ctrl+C中断、kill命令终止等场景
trap 'purge' EXIT INT TERM

# 启动后台进程并记录PID
./daemon1 > a.txt 2>&1 & pids+=($!)
./daemon2 > b.txt 2>&1 & pids+=($!)
./daemon3 > c.txt 2>&1 & pids+=($!)

# 打印已启动的进程ID(验证用)
for pid in "${pids[@]}"; do
  echo "启动的进程: $pid"
done

# 若需等待后台进程执行,可添加wait命令(可选)
# wait

关键说明

  • trap 'purge' EXIT:无论脚本是正常执行完毕还是因错误退出,都会触发purge函数。
  • 额外绑定INT和TERM信号:覆盖用户手动按Ctrl+C(SIGINT)、用kill命令终止脚本(SIGTERM)的场景,确保所有终止情况都能触发清理。
  • 2>/dev/null:忽略kill命令可能产生的错误(比如进程已提前结束),避免清理时输出无关报错。
  • "${pids[@]}":Shell数组的标准写法,确保每个PID被正确解析,避免因特殊字符导致的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:29:51