killall не убивает всех и редко убивает, зачем тогда команда?


12

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

Недавний пример был с Thunderbird, где в памяти было около 5 экземпляров, поэтому я решил использовать killallкоманду. Было убито 2 процесса, а 3 остались в памяти. Попробовал еще раз, и 3 все еще были там.

Поэтому я вручную использовал kill -9команду, чтобы убить каждый из отдельных процессов через их pids. Это сработало.

Я в основном использую kill -9команду, как она работает. Команда killallподвела меня так много раз, что я просто не стал ее использовать. Но должна быть причина, почему это не работает. Я использую это неправильно?

Я знаю, что есть и другие команды, pkillно я был бы рад понять, почему killallкоманда не работает должным образом. Я даже пытался убить только один процесс, и это случайный удар. Но kill -9команда работает каждый раз.

Есть идеи?

PS: sudoне имеет значения

Ответы:


22

Со страницы руководства для killall

killall отправляет сигнал всем процессам, выполняющим любую из указанных команд. Если имя сигнала не указано, отправляется SIGTERM.

Когда вы делаете kill -9, вы отправляете сигнал SIGKILL. Если вы хотите отправить SIGKILL с killall, вам нужно сделать

killall -s SIGKILL <PROCESSNAME>

Хорошее объяснение разницы между SIGKILL и SIGTERM (и почему вы должны сначала попробовать SIGTERM)

С http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

Отправка сигналов процессам с использованием 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.


Есть предположения, почему он убил только некоторые экземпляры Thunderbird?
Меер Борг

@Doogfar Смотрите мою отредактированную рецензию (или страницу, на которую я
ссылался

Спасибо, также объясняет, почему мой Thunderbird поврежден, kill -9 был слишком резким
Meer Borg

Все еще не работает всегда.
Крейг Хикс

4

killallпринимает большинство из того же синтаксиса, что и kill. В частности, нет необходимости писать что-то необычное, чтобы сделать killallэквивалент kill -9. Это работает просто отлично:

killall -9 thunderbird

(Конечно, как уже говорилось, вы обычно неохотно используете killall -9или, что эквивалентно killall -KILL, если другие меры уже не были опробованы без успеха.)


Тем не менее не всегда работает, поэтому должно быть что-то еще.
Крейг Хикс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.