Хороше пояснення різниці між SIGKILL і SIGTERM (і чому слід спробувати SIGTERM спочатку)
Надсилання сигналів процесам, що використовують програвання 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.