问题描述
我想在 Bash 中生成几个子进程,但我希望父脚本保持运行,这样发送到父脚本的信号也会影响生成的子进程。
这不会:
parent.bash
:
#!/usr/bin/bash
spawnedChildProcess1 &
spawnedChildProcess2 &
spawnedChildProcess3 &
parent.bash
立即结束,生成的进程继续独立于它运行。
解决方法
使用 wait
让父进程等待所有子进程退出。
#!/usr/bin/bash
spawnedChildProcess1 &
spawnedChildProcess2 &
spawnedChildProcess3 &
wait
键盘信号被发送到整个进程组,因此输入 Ctl-c 将杀死子进程和父进程。
,如果您不希望您的父级在生成其子级后立即退出,那么正如 Barmar 告诉您的那样,请使用 wait
。
现在,如果您希望子进程在父进程退出时终止,请在退出前向它们发送 SIGTERM
(或任何其他)信号:
kill 0
(0 是一个特殊的PID,表示“父进程组中的每个进程”)
如果父进程可能会意外退出(例如在收到信号时,因为 set -u
或 set -e
等),那么您可以使用 trap
发送 {{1} } 在退出前向孩子发出信号:
TERM
[edit] 总之,这就是你应该如何编写你的父进程:
trap 'kill 0' EXIT
这样就无需将信号发送到负进程 ID,因为这不会涵盖父进程可能死亡的所有情况。