Со страницы руководства системного вызова kill (2):
Если pid отрицателен, но не равен -1, sig отправляется всем процессам (кроме неопределенного набора системных процессов), чей идентификатор группы процессов равен абсолютному значению pid и для которого процесс имеет разрешение на отправку сигнала .
EDIT
(здесь я прошу разъяснений, но мне нужно место и форматирование, которых нет в области комментариев)
Таким образом, pstree будет печатать:
startserv --- expect --- /bin/sh --- srcds_linux
И группировка групп будет:
{startserv --- expect} --- {/bin/sh --- srcds_linux}
И с startserv
вы хотите убить expect
, /bin/sh
и srcds_linux
, но убийство expect
не приводит к expect
убийству его непосредственного потомка (намного меньше, чем группа, к которой относится этот ребенок) глава).
Еще несколько предложений
Может случиться так, что ожидание убийства с помощью некоторого сигнала, кроме SIGKILL
(9), такого как SIGTERM
, может привести к тому, что expect
убьет своего ребенка (и, возможно, группу) за вас перед тем, как прекратить самоуничтожение, но вы, возможно, уже пытались что.
Обнажая, что вы можете попытаться просмотреть /proc/*/stat
, чтобы построить дерево процессов, найти ваш expect
процесс (вы уже знаете его pid), а затем убить его и всех его дочерних элементов. Это не идеально, так как это не атомарно (/ bin / sh может разветвлять еще несколько дочерних объектов или что-то в этом роде), но если вы хотите попытаться это перехватить, вы можете отправить все процессы в этом поддереве SIGSTOP
, так как понимаете, что они находятся под поддеревом expect
, чтобы стабилизировать это дерево. Тогда пошлите им всем более сильное убийство, возможно, сопровождаемое SIGCONT
.
Более автоматический способ сделать это состоит в том, чтобы startserv
создать псевдотерминал для запуска expect
(и его потомков) и затем закрыть управляющую сторону псевдотерминала и надеяться, что все эти программы умрут на SIGHUP
.