How can I kill a whole process tree with Perl?

oliver picture oliver · Nov 20, 2008 · Viewed 8.6k times · Source

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?

Answer

Chris Jester-Young picture Chris Jester-Young · Nov 20, 2008

If you can live with killing a process group, you can use the following:

kill -$signum, $pgid;

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; read perlfunc for explanation) do the following (to send SIGTERM, for example):

kill 'TERM', -$pgid;