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

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

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

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

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

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

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

Есть идеи?

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

решение1

Из страницы руководства 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.

решение2

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

killall -9 thunderbird

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

решение3

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

sudo killall -s SIGTERM processname

Связанный контент