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

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

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

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

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

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

Есть идеи?

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

11
задан 26 November 2015 в 19:04

2 ответа

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

killall -9 thunderbird

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

0
ответ дан 26 November 2015 в 19:04

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

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

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

killall -s SIGKILL <PROCESSNAME>

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

Из [ 114] http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

Отправка сигналов процессам, использующим kill в системе Unix, не новая тема для большинство системных администраторов, но меня много раз спрашивали о разнице между kill и kill -9.

Каждый раз, когда вы используете kill для процесса, вы фактически отправляете процессу сигнал (почти во всех ситуациях - я скоро расскажу об этом). Стандартные приложения C имеют заголовочный файл, содержащий шаги, которые должен выполнить процесс, если он получает определенный сигнал. Вы можете получить полный список доступных сигналов в вашей системе, проверив страницу руководства на предмет kill.

Рассмотрим команду, подобную этой:

kill 2563

Это отправит сигнал под названием SIGTERM процессу. Как только процесс получает уведомление, может произойти несколько разных вещей:

  • процесс может быть остановлен немедленно
  • процесс может остановиться после небольшой задержки после очистки ресурсов
  • [ 117] процесс может продолжаться бесконечно

Приложение может определить, что оно хочет делать после получения SIGTERM. Хотя большинство приложений будут очищать свои ресурсы и останавливаться, некоторые могут этого не делать. Приложение может быть настроено на выполнение чего-то совершенно другого при получении SIGTERM. Кроме того, если приложение находится в плохом состоянии, например в ожидании дискового ввода-вывода, оно может не справиться с отправленным сигналом.

Большинство системных администраторов обычно прибегают к более резкому сигналу, когда приложение не отвечает на SIGTERM:

kill -9 2563

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

Хотя SIGKILL определен в том же файле заголовка сигнала, что и SIGTERM, процесс не может его игнорировать. На самом деле, процесс даже не узнает о сигнале SIGKILL, так как сигнал идет прямо к ядру init. В этот момент init остановит процесс. Процесс никогда не получает возможность поймать сигнал и действовать в соответствии с ним.

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

Когда вы отправили killall (SIGTERM) процессам Thunderbird, вы попросили остановить эти процессы. Некоторые из этих процессов не работали правильно (возможно, поэтому вам нужно было сначала их убить), поэтому они не могли воздействовать на сигнал SIGTERM.

0
ответ дан 26 November 2015 в 19:04

Другие вопросы по тегам:

Похожие вопросы: