Иногда отправка SIGTERM процессу заставляет его отправлять SIGTERM всем своим дочерним процессам. Однако иногда это не срабатывает.
Есть ли команда или утилита, которая позволит мне убить процесс и все его дочерние процессы одновременно? Я обычно прибегаю к ручному сбору всех pid в одну команду kill, но это кажется глупым.
Этот ТАК вопрос спрашивает, как это сделать с помощью perl, но все, что помогает, было бы здорово.
Предполагая, что процессы разделяют идентификатор сеанса (что им и должно быть, если они явно не вызвали 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
Тогда все умирает одним махом.
Аналогичным образом вы можете убить по группе процессов, хотя это, как правило, более полезно для многих дочерних процессов, которые находятся на один уровень ниже родительского, а не для цепочки связанных процессов.
это ТАК вопрос покрывает это.
Обычно отвечающий клиент должен получить sigterm и отключить себя, тем самым завершив все свои разветвленные дочерние процессы. Если, с другой стороны, клиент не отвечает, нормальный сигнал завершения, вероятно, не вызовет никакого ответа.
Затем вы переходите к отправке SIGKILL, который сообщает самой системе о необходимости остановить этот процесс, сейчас - что она может сделать в большинстве случаев, кроме случаев, когда процесс находится в состоянии непрерывного сна, например, ожидая некоторого ввода-вывода. ввод или подобное.
В этом случае даже SIGKILL ничего не сделает с процессом; дочерний процесс, вероятно, будет в таком же состоянии задержки.
Есть граничный случай, когда родительский процесс может завершиться просто красиво, но дочерний процесс нельзя убить. Тогда вы получите процесс зомби, который невозможно очистить, так как его отец ушел, но он ни на что не отвечает. Единственный способ избавиться от них - это перезагрузка; Однако в большинстве случаев они совершенно безвредны, поскольку единственное, что они делают, - это принимают PID, в то время как любой сокет, который они пытались использовать, уже засох.
Если я хочу убить дерево процессов Firefox, можно ли убить его с помощью приведенной выше команды "pkill -9 -s firefox"