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 -uset -e 等),那么您可以使用 trap 来在退出之前发送 TERM 信号到 child:

trap 'kill 0' EXIT

[edit] 总之,您应该这样编写 parent 过程:

#!/usr/bin/bash
trap 'kill 0' EXIT
...
spawnedChildProcess1 &
spawnedChildProcess2 &
spawnedChildProcess3 &
...
wait

这样就不需要将您的信号发送到负进程 ID,因为这不会涵盖您的 parent 进程可能终止的所有情况。