如何使用 Ctrl+C 杀死在 Bash 脚本中启动的所有后台进程?

Iev*_*gen 17 linux bash parallel-processing

ArchLinux (Manjaro)。

我正在运行一个 bash 文件。它运行 2 个进程(命令),使用&. 但是当我按Ctrl+C停止程序时 - 一个进程死了,另一个继续工作。

如何停止这两个进程?或者我如何编写一个新的脚本来杀死这两个进程?

lny*_*yng 22

更新:trap需要SIG根据条件删除前缀,尽管某些 shell 支持包含它。请参阅下面的评论。

&符号“&”在新进程的后台运行命令。当其父进程(在您的情况下运行 bash 脚本的命令)结束时,此后台进程会将其父进程重置为 init (进程为PID1),但不会死亡。当您按下 时ctrl+c,您是在向前台进程发送中断信号,不会影响后台进程。

为了杀死后台进程,您应该使用kill带有PID最近后台进程的命令,可以通过$!.

如果您希望使用ctrl+c杀死脚本和后台进程,您可以这样做:

trap 'kill $BGPID; exit' INT
sleep 1024 &    # background command
BGPID=$!
sleep 1024      # foreground command of the script
Run Code Online (Sandbox Code Playgroud)

trap修改SIGINT(trap需要删除SIG前缀,但某些 shell 可能支持包含它)的陷阱处理程序, 因此脚本将在进程$BGPID退出之前终止进程。