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