bash - 当我中断我的 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 本身。
我很感激这里的一些见解
谢谢
解决方案
我找到了使用 pkill 的解决方案。此示例还处理许多子进程。
#!/bin/bash
trap 'pkill -P $$' SIGINT SIGTERM
for i in {1..10}; do
sleep 10 &
done
wait
这似乎优雅地杀死了所有子进程。尽管除了发送正确的信号外,我并没有正确理解原始代码的问题所在。
推荐阅读
- gpflow - GPFlow 同一 GP 的多个独立实现,不规则的采样时间/长度
- scala - 如何在 spark 结构化流中执行 functions.from_csv
- mysql - MYSQL:两个表和预期结果
- sql - 在一个 SQL 查询中使用两个不同的时间戳
- mongodb - 使用 MongoDB Panache 在 CodecProvider 中无法进行依赖注入?
- c++ - 如何用最后一个匹配的字符和常量替换字符串中最后一个匹配的字符
- wordpress - 如何使用 ampps 为 wordpress 注册域?
- php - PHP 仅验证数字和带逗号的数字
- php - PHP - 删除数组中的重叠条目
- sql - 在 postgres 中同时计算 AVG 和 stddev_pop 的有效方法