我在子 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 -$!
这将使其与以前的版本不兼容。
所以最新版本包含了这个。拜托,拜托,拜托,看看你能不能打破这个。
你能举例说明新行为比旧行为更糟糕吗?
/奥莱