![在 systemctl 关闭时优雅终止子进程](https://linux22.com/image/187490/%E5%9C%A8%20systemctl%20%E5%85%B3%E9%97%AD%E6%97%B6%E4%BC%98%E9%9B%85%E7%BB%88%E6%AD%A2%E5%AD%90%E8%BF%9B%E7%A8%8B.png)
我喜欢传感器史密斯回答于在 Bash 中将 SIGTERM 转发给子进程,但对于我的systemctl
脚本,它导致了一个双 SIGTERM,因为systemctl
将 SIGTERM 发送到父 bash 实例和我正在运行的子实例。结果是在我的孩子可以优雅地关闭之前立即终止。
在基于 bash 脚本的服务中处理 SIGTERM 的正确方法是什么?
答案1
所以我最终得到了这个,我很高兴:
#!/bin/bash
script_term()
{
echo $0 SIGTERM
}
wait_for_child()
{
term_child_pid=$!
wait ${term_child_pid} 2>/dev/null
trap - TERM INT
wait ${term_child_pid} 2>/dev/null
}
trap 'script_term' TERM INT
node index.js
wait_for_child
它在我关心的所有情况下都正确等待,尽管当父 bash 发出 SIGTERM 时,它不会对子进程发出 SIGTERM 信号。