Как завершить дерево процессов в Linux?

Как завершить дерево процессов в Linux?

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

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

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

решение1

ЭтотТАКОЙ вопросохватывает это.

решение2

Предполагая, что процессы имеют общий идентификатор сеанса (а они должны иметь его, если только они явно не вызвали 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

А потом все умирает одним махом.

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

решение3

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

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

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

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

решение4

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

Связанный контент