【发布时间】:2019-12-07 08:47:11
【问题描述】:
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 & #wait $!被注释掉(从代码中去掉),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 个 pid(子进程),但仍然存在这种差异?为什么我在等待 3 个 pid 时需要睡眠?
【问题讨论】:
-
检查wait返回的值。一般来说,如果它大于 128,那么它会被信号提前终止(通过信号 $? - 128),所以你可能正在寻找类似
while wait $pid1 $pid2 $pid3; test $? -ge 128; do : ; done