如何在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
相关产品推荐
相关产品推荐

