Как лучше всего отправить сигнал всем членам группы процессов? - PullRequest
403 голосов
/ 24 декабря 2008

Я хочу убить целое дерево процессов. Каков наилучший способ сделать это с использованием любых распространенных языков сценариев? Я ищу простое решение.

Ответы [ 32 ]

0 голосов
/ 02 сентября 2018

Убить группу, используя только имя процесса, принадлежащего группе:

kill -- -$(ps -ae o pid,pgrp,cmd | grep "[e]xample.py" | awk '{print $2}' | tail -1)

Это модификация ответа olibre, но вам не нужно знать PID, просто имя члена группы.

Пояснение:

Чтобы получить идентификатор группы, выполните команду ps, используя аргументы, как показано, grep для вашей команды, но отформатируйте example.py с кавычками и используйте скобку для первой буквы (это отфильтровывает саму команду grep) отфильтруйте его через awk, чтобы получить второе поле, которое является идентификатором группы. Хвост -1 избавляется от дубликатов групповых идентификаторов. Вы помещаете все это в переменную, используя синтаксис $ () и вуаля - вы получаете идентификатор группы. Таким образом, вы замените этот $ (беспорядок) на этот -группа выше.

0 голосов
/ 22 декабря 2014

В sh команда jobs перечислит фоновые процессы. В некоторых случаях может быть лучше сначала убить новейший процесс, например, старый создал общий сокет. В этих случаях сортируйте PID в обратном порядке. Иногда вам нужно подождать, пока задания запишут что-то на диск или что-то подобное, прежде чем они остановятся.

И не убивай, если не надо!

for SIGNAL in TERM KILL; do
  for CHILD in $(jobs -s|sort -r); do
    kill -s $SIGNAL $CHILD
    sleep $MOMENT
  done
done
...