Хорошее объяснение разницы между SIGKILL и SIGTERM (и почему вы должны сначала попробовать SIGTERM)
Отправка сигналов процессам с использованием kill в системе Unix не является новой темой для большинства системных администраторов, но меня много раз спрашивали о разнице между kill и kill -9.
Каждый раз, когда вы используете kill для процесса, вы фактически посылаете процессу сигнал (почти во всех ситуациях - я скоро расскажу об этом). Стандартные приложения C имеют заголовочный файл, который содержит шаги, которые должен выполнить процесс, если он получает определенный сигнал. Вы можете получить полный список доступных сигналов в вашей системе, проверив man-страницу на kill.
Рассмотрим такую команду:
kill 2563
Это отправит сигнал под названием SIGTERM в процесс. Как только процесс получит уведомление, может произойти несколько разных вещей:
- процесс может немедленно остановиться
- процесс может остановиться после небольшой задержки после очистки ресурсов
- процесс может продолжаться бесконечно
Приложение может определить, что оно хочет сделать после получения SIGTERM. Хотя большинство приложений очищают свои ресурсы и останавливаются, некоторые могут этого не делать. Приложение может быть настроено на что-то совершенно другое при получении SIGTERM. Кроме того, если приложение находится в плохом состоянии, например в ожидании дискового ввода-вывода, оно может не справиться с отправленным сигналом.
Большинство системных администраторов обычно прибегают к более резкому сигналу, когда приложение не отвечает на SIGTERM:
kill -9 2563
-9 сообщает команде kill, что вы хотите отправить сигнал № 9, который называется SIGKILL. С таким именем очевидно, что этот сигнал имеет немного больший вес.
Хотя SIGKILL определен в том же файле заголовка сигнала, что и SIGTERM, процесс не может его игнорировать. На самом деле, процесс даже не узнает о сигнале SIGKILL, так как сигнал идет прямо в init ядра. В этот момент init остановит процесс. Процесс никогда не получает возможность поймать сигнал и действовать в соответствии с ним.
Однако ядро может быть не в состоянии успешно завершить процесс в некоторых ситуациях. Если процесс ожидает сетевой или дисковый ввод-вывод, ядро не сможет его остановить. Зомби-процессы и процессы, пойманные в непрерывном сне, также не могут быть остановлены ядром. Перезагрузка необходима для очистки этих процессов от системы.
Когда вы отправили killall (SIGTERM) процессам Thunderbird, вы попросили остановить эти процессы. Некоторые из этих процессов не работали правильно (возможно, поэтому вам нужно было сначала их убить), поэтому они не могли воздействовать на сигнал SIGTERM.
killall
принимает большинство из того же синтаксиса, что иkill
. В частности, нет необходимости писать что-то необычное, чтобы сделатьkillall
эквивалентkill -9
. Это работает просто отлично:(Конечно, как уже говорилось, вы обычно неохотно используете
killall -9
или, что эквивалентноkillall -KILL
, если другие меры уже не были опробованы без успеха.)источник