在 systemctl 关闭时优雅终止子进程

在 systemctl 关闭时优雅终止子进程

我喜欢传感器史密斯回答于在 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 信号。

相关内容