Linux Perl:从任何子级杀死整棵树

Linux Perl:从任何子级杀死整棵树,linux,perl,Linux,Perl,我有一个带有几个递归分叉实例的perl脚本。什么样的好方法可以杀死任何有叉的孩子的整棵树?不需要是干净的,kill-9就足够了。当shell启动一个进程时,它使其成为进程组的开始 $ perl -MPOSIX -E' my $pid = fork(); say getpgrp(), " ", getpid(); waitpid($pid, 0) if $pid; ' 6164 6164 6164 6167 如果没有子进程更改其进程组,则可以向进程组发送信号。例如,以下命令将把

我有一个带有几个递归分叉实例的perl脚本。什么样的好方法可以杀死任何有叉的孩子的整棵树?不需要是干净的,
kill-9就足够了。

当shell启动一个进程时,它使其成为进程组的开始

$ perl -MPOSIX -E'
   my $pid = fork();
   say getpgrp(), " ", getpid();
   waitpid($pid, 0) if $pid;
'
6164 6164
6164 6167
如果没有子进程更改其进程组,则可以向进程组发送信号。例如,以下命令将把
SIGTERM
发送到与process
1234
相同的流程组中的所有流程:

kill -s TERM -1234

如果某些子进程组被更改,您需要抛出一个可捕获的信号(例如not
SIGKILL
),并且具有更改的进程组的子进程的父进程需要显式捕获并将信号重新发送给这些子进程。

killall
kill
带负pid?带负pid的
kill
会从任何子树中删除整个树吗?我找不到任何支持这一点的信息。不,它会杀死一个进程组。这就是问题所在,我无法理解调用
kill 9,-$pid
是否会杀死调用
kill
的进程及其子进程,或者祖先进程也会被杀死?假设我在分叉期间调用
setpgrp 0,0