为什么 bash 脚本在接收到 Sigterm 后退出父脚本之前不等待其子进程完成?

Why doesn't bash script wait for its child processes to finish before exiting the parent script on receiving Sigterm?

trap exit_gracefully TERM

exit_gracefully() {
    echo "start.sh got SIGTERM"
    echo "Sending TERM to child_process_1_pid: ${child_process_1_pid}"
    echo "Sending TERM to child_process_2_pid: ${child_process_2_pid}"
    echo "Sending TERM to child_process_3_pid: ${child_process_3_pid}"
    kill -TERM ${child_process_1_pid} ${child_process_2_pid} ${child_process_3_pid}
}

consul watch -http-addr=${hostIP}:8500 -type=key -key=${consul_kv_key} /child_process_1.sh 2>&1 &
child_process_1_pid=$!

/child_process_2.sh &
child_process_2_pid=$!

/child_process_3.sh &
child_process_3_pid=$!

/healthcheck.sh &

/configure.sh

# sleep 36500d &
# wait $!

wait ${child_process_1_pid} ${child_process_2_pid} ${child_process_3_pid}

echo 'start.sh exiting'

start.sh 是父脚本。当 SIGTERM 被捕获时,它被转发给它的 3 个子进程。如果# sleep 36500d & # 等待 $! 被注释(从代码中删除),start.sh 不等待 child_process_1.sh、child_process_2.sh 和 child_process_3.sh 接收SIGTERM,在退出父进程 (start.sh) 之前处理它并退出,而不是 start.sh 在收到 SIGTERM 时立即退出,甚至在子进程可以处理它之前。但是,如果我在代码中保留 sleep 36500d & wait $! 未注释,父进程 (start.sh) 等待子进程 (1、2 和 3) 接收、处理Sigterm 并在退出之前先退出。

即使在这两种情况下我都等待 3 个(子进程的)pids,为什么仍然存在这种差异?为什么我在等待 3 个 pids 时需要睡眠?

接收信号将导致任何正在进行的 wait 命令到 return。

这是因为信号的目的是中断当前正在执行的进程。

您看到的所有效果只是当前 wait returning、处理程序 运行 以及从 wait 退出处继续的脚本的结果.