在bash函数中杀死gnu并行

在bash函数中杀死gnu并行

我在子 shell 函数中使用 gnu parallel,例如,

func()(
    parallel --will-cite sleep ::: 60
)

在发送SIGTERM到函数后,我希望并行也被杀死。但我得到

$ func &
[1] 13255
$ pgrep -P 13255 # child of func -> the subshell
13256
$ pgrep -P 13256 # child of the subshell -> gnu parallel
13257
$ kill -TERM -- -13255 # terminating the process group
parallel: SIGTERM received. No new jobs will be started.
parallel: Waiting for these 1 jobs to finish. Send SIGTERM again to stop now.
parallel: sleep 60
$ kill -TERM -- -13255 # sending a second SIGTERM
bash: kill: (-18093) - No such process

所以我不能在不首先跟踪它的进程 ID 的情况下杀死并行。我试图在函数内放置一个陷阱

func()(
    trap "pkill -P $$; pkill -P $$; exit" TERM
    parallel --will-cite sleep ::: 60
)

哪里pkill -P $$应该杀死所有孩子,但检查ps $pid_of_parallel显示,并行在第一个终止信号后继续运行。

我的目标是编写该函数,以便funct &; kill $!立即终止它和所有子进程。我怎样才能实现这个目标?

答案1

我相信最新版本的 GNU 并行现在包含了这个。来自 GNU 并行开发列表:

2019 年 3 月 10 日星期日晚上 8:29 Ole Tange 写道:

今天要停止 GNU Parallel,您需要发送 TERM 以使其停止启动新作业,然后发送另一个 TERM 以终止正在运行的作业。

我正在考虑更改它以发送 HUP 来停止启动新作业并发送 TERM 来终止正在运行的作业。

这将使杀死 GNU Parallel 变得更容易:

$ bash -c '并行-j1 sleep ::: 111 222' &

然后,这将使用 bash 和并行杀死进程组

$ 杀死 -TERM -$!

这将使其与以前的版本不兼容。

所以最新版本包含了这个。拜托,拜托,拜托,看看你能不能打破这个。

你能举例说明新行为比旧行为更糟糕吗?

/奥莱

相关内容