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

10

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

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

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

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

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

Любые идеи?

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

    
задан Meer Borg 21.03.2013 в 22:55
источник

2 ответа

18

На странице man для killall

  

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

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

killall -s SIGKILL <PROCESSNAME>

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

От Ссылка

  

Отправка сигналов процессам с использованием 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, так как сигнал поступает прямо к   kernel init. В этот момент init остановит процесс. Процесс   никогда не получает возможность поймать сигнал и действовать на нем.

     

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

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

ответ дан tgm4883 21.03.2013 в 23:04
источник
2

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

killall -9 thunderbird

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

    
ответ дан Eliah Kagan 21.03.2013 в 23:16