从 Perl 脚本中杀死一个进程及其所有子进程的最佳方法是什么?它至少应该在 Linux 和 Solaris 下运行,并且不需要安装任何额外的软件包。
我的猜测是通过解析 /proc 中的文件或解析ps
(在 Linux 和 Solaris 之间似乎都不可移植)的输出来获取所有进程及其父进程的列表;然后杀死树中的所有进程(这似乎容易出现竞争条件)。
在这种特殊情况下,我可以忍受竞争条件,但我如何便携地获取进程列表?
如果您可以忍受终止进程组,则可以使用以下命令:
kill -$signum, $pgid;
其中$signum
是信号编号,$pgid
是进程组 ID。但是,信号编号不是很便携,在这种情况下,您可以(在某些平台上;阅读perlfunc
说明)执行以下操作(SIGTERM
例如,发送):
kill 'TERM', -$pgid;
CPAN 有一个答案。是的,我知道你不想安装额外的模块,但至少你可以看看实现,看看他们在做什么......
我改编并破解了“rkill”来完成这项工作,这很容易。
https://gitlab.com/pslist/pslist/blob/master/pslist
这是 ubuntu 中“pslist”包的一部分。