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

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

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

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

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

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

Есть идеи?

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

3 ответа

Решение

Из справочной страницы для 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.

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

killall -9 thunderbird

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

Для тех, кто ищет быстрый ответ:

      sudo killall -s SIGTERM processname
Другие вопросы по тегам