我有一个shell脚本,它在后台生成一个子进程并等待它(通过wait命令)。它还捕获SIGTERM并将其传递给孩子。但每当我将SIGTERM发送到父进程时,它就会出现在"等待"即使孩子还在跑步(孩子抓住了SIGTERM)。是否有可能在shell脚本内实现真正等待孩子直到孩子死亡?
答案 0 :(得分:1)
这是常见习语所依赖的明确行为。请注意以下差异:
# this waits 10 seconds, and doesn't handle signal handlers until later
sleep 10
# this returns immediately when a signal is received
sleep 10 & wait $!
您完全能够检查剩余的后台任务是否存在并再次等待:
sleep 10 & pid=$!
while kill -0 "$pid"; do wait "$pid"; done
有关信号处理的完整讨论,包括此处描述的行为,请参阅SignalTrap。