Как я могу убить целое дерево процессов с помощью Perl? - PullRequest
7 голосов
/ 20 ноября 2008

Какой лучший способ убить процесс и все его дочерние процессы из сценария Perl? Он должен работать как минимум под Linux и Solaris и не требовать установки каких-либо дополнительных пакетов.

Мое предположение должно было бы получить список всех процессов и их родителей, анализируя файлы в / proc или анализируя вывод ps (ни один из которых не кажется переносимым между Linux и Solaris); а затем убивает все процессы в дереве (что кажется склонным к условиям гонки).

Я мог бы жить с условиями гонки в данном конкретном случае, но как мне получить список процессов?

Ответы [ 3 ]

9 голосов
/ 20 ноября 2008

Если вы можете жить, убивая группу процессов, вы можете использовать следующее:

kill -$signum, $pgid;

, где $signum - номер сигнала, а $pgid - идентификатор группы процессов. Однако номера сигналов не очень переносимы, и в этом случае вы можете (на некоторых платформах; для объяснения прочитать perlfunc) сделать следующее (например, для отправки SIGTERM):

kill 'TERM', -$pgid;
8 голосов
/ 20 ноября 2008

CPAN имеет ответ. Да, я знаю, что вы не хотели устанавливать дополнительные модули, но, по крайней мере, вы можете посмотреть на реализацию и посмотреть, что они делают ...

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

0 голосов
/ 08 декабря 2017

Я адаптировал и взломал "rkill", чтобы сделать работу, это было легко.

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

Это часть пакета "pslist", например, убунт.

...