Как вы убиваете дерево процессов в Linux? [закрыто]

14

Иногда отправка SIGTERM процессу приводит к отправке SIGTERM всем его дочерним процессам. Однако иногда это не работает.

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

Этот ТАК вопрос спрашивает, как сделать это с Perl, но все, что делает работу, было бы здорово.

itsadok
источник
Похоже, pkill -9это более мощный, чем pkillпо любой причине.
Андрей

Ответы:

13

Предполагая, что процессы совместно используют идентификатор сеанса (что они должны делать, если они явно не вызвали setsid (), вы можете уничтожить их с помощью сеанса, используя pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

Если из другого терминала я делаю:

pkill -9 -s 12804

Тогда все умирает одним махом.

Аналогичным образом можно выполнить уничтожение по группам процессов, хотя это имеет тенденцию быть более полезным для многих дочерних элементов, которые находятся на один уровень ниже родительского, а не цепочки связанных процессов.

Джеймс Ф
источник
2

Как правило, отвечающий клиент должен получить sigterm и отключиться сам, тем самым завершив все его разветвленные дочерние процессы. Если, с другой стороны, клиент не отвечает, нормальный сигнал завершения, вероятно, не вызовет ответа.

Затем вы продолжаете посылать сигнал SIGKILL, который говорит самой системе «Сделать этот процесс остановленным сейчас», что он может делать большую часть времени, за исключением случаев, когда процесс находится в состоянии непрерывного сна, например, ожидание некоторого ввода-вывода. вход или аналогичный.

В этом случае, даже SIGKILL ничего не сделает с процессом; дочерний процесс, вероятно, будет в аналогичном состоянии отсталости.

Существует граничный случай, когда родительский процесс может просто красиво завершиться, но дочерний процесс не подлежит уничтожению. Тогда вы закончите с процессом зомби, который не может быть очищен, так как его отец ушел, но он не реагирует ни на что. Единственный способ избавиться от них - перезагрузка; однако в большинстве случаев они совершенно безвредны, поскольку единственное, что они делают, - это получают PID, в то время как сокет, который они пытались использовать, уже иссяк.

towo
источник
2

Если я хочу уничтожить дерево процессов Firefox, то можно ли его уничтожить с помощью приведенной выше команды "pkill -9 -s firefox"


источник