gpt4 book ai didi

bash - 当我中断 bash 脚本时试图关闭所有子进程

转载 作者:行者123 更新时间:2023-12-04 01:49:20 28 4
gpt4 key购买 nike

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

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

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

我曾尝试将 trap 与 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

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

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

我很感激这里的一些见解

谢谢

最佳答案

在 bash 中使用 &在命令之后,它将该命令作为后台作业(此后台作业称为 job_spec )递增 1,直到您退出该终端 session 。您可以使用 jobs命令以获取正在运行的后台作业列表。要处理此工作,您必须使用 %与作业 ID。 jobs命令还接受其他选项,例如 jobs -p查看所有作业的进程信息,jobs -p %JOB_SPEC查看该特定作业的 id 过程。

#!/usr/bin/env bash

trap 'kill -9 %1' 2

sleep 10 &

wait

或者
#!/usr/bin/env bash

trap 'kill -9 $(jobs -p %1)' 2

sleep 10 &

wait

几年前我实现了这样的东西,你可以看看它 async bash

关于bash - 当我中断 bash 脚本时试图关闭所有子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53980609/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com