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


12

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

Недавній приклад був із громовідводом, де було близько 5 екземплярів пам’яті, тому я вирішив скористатися killallкомандою. Загинуло 2 процеси, а 3 залишилися в пам’яті. Спробував ще раз, і 3 ще були там.

Тому я вручну використовував kill -9команду, щоб вбити кожен з окремих процесів через їхні підписи. Це спрацювало.

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

Я знаю, що існують інші команди на кшталт, pkillале я буду вдячний зрозуміти, чому killallкоманда не працює так, як очікувалося. Я навіть намагався вбити лише один процес, і це справа хіта і пропуску. Але kill -9команда працює щоразу.

Будь-які ідеї?

PS: sudoне має значення

Відповіді:


22

Зі сторінки man для 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 є заголовок-файл, який містить кроки, які повинен виконувати процес, якщо він отримує певний сигнал. Ви можете отримати весь перелік доступних сигналів у вашій системі, перевіривши довідкову сторінку на вбивство.

Розглянемо таку команду:

kill 2563

Це відправить сигнал під назвою SIGTERM в процес. Як тільки процес отримає повідомлення, може статися кілька різних речей:

  • процес може негайно припинитися
  • після очищення ресурсів процес може зупинитися після невеликої затримки
  • процес може тривати нескінченно

Додаток може визначити, що він хоче робити, коли буде отримано SIGTERM. У той час як більшість програм очищатимуть свої ресурси та зупинятимуться, деякі можуть не робити. Програма може бути налаштована на те, щоб зробити щось зовсім інше, коли отримано SIGTERM. Крім того, якщо програма знаходиться в поганому стані, наприклад, очікування дискового вводу / виводу, воно може не мати можливості діяти на надісланий сигнал.

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

kill -9 2563

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

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

Однак ядро, можливо, не зможе успішно вбити процес у деяких ситуаціях. Якщо процес очікує мережевого або дискового вводу / виводу, ядро ​​не зможе його зупинити. Зомбі-процеси та процеси, що потрапляють у режим безперебійного сну, також не можуть бути зупинені ядром. Для очищення цих процесів від системи потрібна перезавантаження.

Коли ви надіслали killall (SIGTERM) до громових процесів, ви попросили ці процеси припинити. Деякі з цих процесів не працювали коректно (напевно, чому вам потрібно було вбити їх в першу чергу), тому вони не могли діяти на сигнал SIGTERM.


Будь-які спекуляції, чому це вбило лише деякі випадки громовідводу?
Meer Borg

@Doogfar Дивіться мої відредаговані записи (або сторінку, яку я пов’язав)
tgm4883

Дякую, також пояснює, чому мій громовержчик зіпсувався, убий -9 був занадто суворим
Meer Borg

Ще не завжди працює.
Крейг Хікс

4

killallприймає більшість того ж синтаксису, що і kill. Зокрема, не потрібно писати нічого фантазійного, щоб зробити killallеквівалент kill -9. Це працює чудово:

killall -9 thunderbird

(Звичайно, як це обговорювалося, зазвичай ви не бажаєте використовуватись, killall -9або, що, навіть killall -KILL, якщо інші заходи вже не були застосовані без успіху.)


Все ще не завжди працює, тому має бути щось інше.
Крейг Хікс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.