为什么 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
退出处继续的脚本的结果.
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
退出处继续的脚本的结果.