首页 > 解决方案 > 当我中断我的 bash 脚本时试图关闭所有子进程

问题描述

我编写了一个 bash 脚本来对我的系统进行一些测试。测试在后台并行运行。测试可能需要很长时间,有时我可能希望中止测试。

如果我 Control+C 那么它会中止父脚本,但让各个子脚本继续运行。我希望这样做,以便我可以按 Control+C 或以其他方式退出,然后杀死在后台运行的所有子进程。如果我直接从终端运行后台作业,我有一些代码可以完成这项工作,但它在我的脚本中不起作用。

我有一个最小的工作示例。

我尝试将陷阱与 pgrep -P $$ 结合使用。

#!/bin/bash

trap 'kill -n 2 $(pgrep -P $$)' 2
sleep 10 &
wait

我希望在点击 control+c (SIGINT) 时会杀死脚本启动的所有内容,但它实际上说:

./breakTest.sh: line 1: kill: (3220) - No such process

这个数字发生了变化,但似乎不适用于任何正在运行的进程,所以我不知道它来自哪里。

我想如果陷阱命令的内容在陷阱命令发生的地方得到评估,那么它可能会解释结果。3220 pid 可能用于 pgrep 本身。

我很感激这里的一些见解

谢谢

标签: bashinterruptchild-processbash-trap

解决方案


我找到了使用 pkill 的解决方案。此示例还处理许多子进程。

#!/bin/bash
trap 'pkill -P $$' SIGINT SIGTERM
for i in {1..10}; do
   sleep 10 &
done
wait

这似乎优雅地杀死了所有子进程。尽管除了发送正确的信号外,我并没有正确理解原始代码的问题所在。


推荐阅读