Bash:生成在父脚本退出时退出的子进程

问题描述

我想在 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 -uset -e 等),那么您可以使用 trap 发送 {{1} } 在退出前向孩子发出信号:

TERM

[edit] 总之,这就是你应该如何编写你的父进程:

trap 'kill 0' EXIT

这样就无需将信号发送到负进程 ID,因为这不会涵盖父进程可能死亡的所有情况。