为什么';bash脚本在接收到Sigterm时退出父脚本之前,是否等待其子进程完成?

为什么';bash脚本在接收到Sigterm时退出父脚本之前,是否等待其子进程完成?,bash,shell,sigterm,Bash,Shell,Sigterm,start.sh是父脚本。当SIGTERM被捕获时,它被转发到它的3个子进程。如果#睡眠36500d& #等等$已注释(从代码中删除),start.sh不会等待child_process_1.sh、child_process_2.sh和child_process_3.sh接收SIGTERM,处理它并在退出父进程(start.sh)之前退出,而是在接收到SIGTERM时立即退出start.sh,甚至在子进程可以处理它之前。但是如果我继续睡36500d&等等$在代码中未注释,父进程(start.sh

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


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

接收信号将导致任何正在执行的
wait
命令返回

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


您看到的所有效果都只是当前
wait
返回、处理程序运行以及脚本从
wait
退出的地方继续执行的结果。

因此,我们可以在
退出中添加
wait
(前提是相同的PID不会再次被回收和重用)?我只需循环,直到
wait
成功退出,可能由handlerCheck设置的标志保护等待返回的值。通常,如果它大于128,那么它被一个信号提前终止(通过信号$?-128),因此您可能希望在等待$pid1$pid2$pid3时执行类似于
的操作;测试$-ge 128;do:;完成
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'