What's the best way to kill a process and all its child processes from a Perl script? It should run at least under Linux and Solaris, and not require installation of any additional packages.
My guess would be to get a list of all processes and their parents by parsing files in /proc or by parsing the output of ps
(neither of which seems portable between Linux and Solaris); and then killing all processes in the tree (which seems prone to race conditions).
I could live with the race conditions in this particular case, but how do I portably get the process list?
If you can live with killing a process group, you can use the following:
where
$signum
is the signal number, and$pgid
is the process group ID. However, signal numbers aren't very portable, in which case you can (on some platforms; readperlfunc
for explanation) do the following (to sendSIGTERM
, for example):I adapted and hacked "rkill" to do the job, it was easy.
https://gitlab.com/pslist/pslist/blob/master/pslist
This is part of "pslist" package in e.g. ubuntu.
CPAN has an answer. Yes, I know you did not want to install additional modules, but at least you can look at the implementation and see what they are doing...
https://metacpan.org/pod/Proc::ProcessTable