我有一个 shell 脚本,它在后台生成一个子进程并等待它(通过 wait 命令)。它还捕获 SIGTERM 并将其传递给 child 。但是每当我向父进程发送 SIGTERM 时,即使 child 仍在运行( child 捕获 SIGTERM),它也会从“等待”中退出。是否有可能在 shell 脚本中实现真正等待 child 直到 child 死亡?
最佳答案
这是常见习语所依赖的显式行为。请注意以下区别:
# 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 .
关于linux - 即使子进程仍在运行,Bash 等待子进程也可以返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41582738/