7

从 Perl 脚本中杀死一个进程及其所有子进程的最佳方法是什么?它至少应该在 Linux 和 Solaris 下运行,并且不需要安装任何额外的软件包。

我的猜测是通过解析 /proc 中的文件或解析ps(在 Linux 和 Solaris 之间似乎都不可移植)的输出来获取所有进程及其父进程的列表;然后杀死树中的所有进程(这似乎容易出现竞争条件)。

在这种特殊情况下,我可以忍受竞争条件,但我如何便携地获取进程列表?

4

3 回答 3

9

如果您可以忍受终止进程组,则可以使用以下命令:

kill -$signum, $pgid;

其中$signum是信号编号,$pgid是进程组 ID。但是,信号编号​​不是很便携,在这种情况下,您可以(在某些平台上;阅读perlfunc说明)执行以下操作(SIGTERM例如,发送):

kill 'TERM', -$pgid;
于 2008-11-20T16:29:23.833 回答
8

CPAN 有一个答案。是的,我知道你不想安装额外的模块,但至少你可以看看实现,看看他们在做什么......

https://metacpan.org/pod/Proc::ProcessTable

于 2008-11-20T16:35:08.767 回答
0

我改编并破解了“rkill”来完成这项工作,这很容易。

https://gitlab.com/pslist/pslist/blob/master/pslist

这是 ubuntu 中“pslist”包的一部分。

于 2017-12-08T12:04:08.080 回答