Я иногда использую команду killall
для уничтожения процессов. Причина, по которой я иногда говорю, заключается в том, что в некоторых случаях это не сработало для меня.
Недавний пример был с Thunderbird, где в памяти было около 5 экземпляров, поэтому я решил использовать команду killall
. Было убито 2 процесса, а 3 остались в памяти. Попробовал еще раз, а 3 все еще были там.
Поэтому я вручную использовал команду kill -9
, чтобы уничтожить каждый из отдельных процессов через их pids. Это сработало.
Я в основном использую команду kill -9
, как она работает. Команда killall
подводила меня так много раз, что я просто не стал ее использовать. Но должна быть причина, почему это не работает. Я использую это неправильно?
Я знаю, что есть другие команды, такие как pkill
, но я был бы рад понять, почему команда killall
не работает должным образом. Я даже пытался убить только один процесс, и это случайный удар. Но команда kill -9
работает каждый раз.
Есть идеи?
PS: sudo
не имеет значения
killall
принимает большинство из того же синтаксиса, что и kill
. В частности, нет необходимости писать что-то необычное, чтобы заставить killall
сделать эквивалент kill -9
. Это прекрасно работает:
killall -9 thunderbird
(Конечно, как уже говорилось, вы обычно неохотно используете killall -9
или, что эквивалентно, killall -KILL
, если другие меры уже не были опробованы без успеха.)
Со страницы руководства для killall
killall отправляет сигнал всем процессам, выполняющим любую из указанных команд. Если имя сигнала не указано, отправляется SIGTERM.
blockquote>Когда вы делаете
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 остановит процесс. Процесс никогда не получает возможность поймать сигнал и действовать в соответствии с ним.
Однако ядро может быть не в состоянии успешно завершить процесс в некоторых ситуациях. Если процесс ожидает сетевой или дисковый ввод-вывод, ядро не сможет его остановить. Зомби-процессы и процессы, попавшие в непрерывный сон, также не могут быть остановлены ядром. Перезагрузка необходима для очистки этих процессов от системы.
blockquote>Когда вы отправили killall (SIGTERM) процессам Thunderbird, вы попросили остановить эти процессы. Некоторые из этих процессов не работали правильно (возможно, поэтому вам нужно было сначала их убить), поэтому они не могли воздействовать на сигнал SIGTERM.