Ответ
Сигнал SIGKILL (код 9) — это сигнал безусловного завершения процесса. Его следует использовать только в крайних случаях, когда процесс игнорирует корректные запросы на завершение.
Правильная последовательность завершения процесса:
- SIGTERM (15): Вежливый запрос на завершение. Процесс получает уведомление и может выполнить процедуры очистки (закрыть файлы, завершить сетевые соединения, сохранить состояние). Это стандартный сигнал для
killиsystemctl stop. - SIGINT (2): Аналогичен нажатию Ctrl+C. Часто обрабатывается приложениями для graceful shutdown.
- SIGKILL (9): Применяется, если процесс не завершился после SIGTERM в течение заданного таймаута.
Конкретные сценарии для SIGKILL:
- Процесс "завис" и не реагирует на другие сигналы.
- Критическая ситуация, когда процесс потребляет все ресурсы и его нужно остановить немедленно.
- В скриптах оркестрации или systemd unit files, где после
TimeoutStopSecиспользуетсяSendSIGKILL=yes.
Пример с таймаутом (в скрипте или вручную):
# Отправляем SIGTERM
kill -15 <PID>
# Ждём 30 секунд
sleep 30
# Проверяем, жив ли процесс. Если да — отправляем SIGKILL
if kill -0 <PID> 2>/dev/null; then
echo "Процесс не ответил на SIGTERM, отправляем SIGKILL"
kill -9 <PID>
fi
Важные предостережения:
SIGKILLнельзя перехватить или проигнорировать процессом. Ядро завершает процесс немедленно.- Это может привести к утечкам ресурсов (незакрытые файловые дескрипторы, сокеты), повреждению данных (если процесс писал в файл) или нарушению целостности (незавершённые транзакции в БД).
- В production-средах перед
kill -9всегда стоит проверить логи процесса и состояние дисковых операций (командаiostatилиiotop), чтобы понять причину зависания.
Ответ 18+ 🔞
Слушай, а вот это про сигналы — это вообще отдельная песня, ебать мои старые костыли. Представь себе: ты — процесс. Сидишь ты такой, работаешь, файлы пишешь, с базой данных общаешься. И тут тебе приходит SIGTERM (это пятнадцатый, если что). Это как вежливый стук в дверь: «Братан, давай закругляйся, всё сохрани и выходи». Нормальный мужик так и сделает — соединения закроет, данные на диск сбросит, детям-процессам своим скажет, что папа уходит. Это как systemctl stop или просто kill. Всё цивилизованно.
А теперь сценарий пиздопроебибна. Ты стучишь-стучишь, а он в дугу! Не отвечает. Молчит, как партизан. Ресурсы все сожрал, память тупо не отдаёт. Вот тут уже терпения ноль ебать. Берёшь SIGKILL (девятый, мать его) и — хуй с горы! Это не запрос, это приговор. Ядро ОС хватает процесс за шкирку и вышвыривает в /dev/null без возможности апелляции. Никаких «ой, подожди секундочку». Мгновенная смерть.
Так когда же этот тяжёлый аргумент использовать? Да когда уже всё, приплыли. Процесс завис намертво, на SIGTERM плюёт с высокой колокольни. Или ситуация критическая — он, сука, всю оперативку сожрал и сервер вот-вот ляжет. В скриптах всяких или в конфигах systemd это обычно делают с таймаутом: послали SIGTERM, подождали TimeoutStopSec, а если не помер — тогда уже добивают девяткой.
Вот, смотри, как в жизни выглядит:
# Пробуем по-хорошему (SIGTERM)
kill -15 <PID>
# Даём шанс опомниться, ждём, скажем, полминуты
sleep 30
# Проверяем, а не ожил ли мудак?
if kill -0 <PID> 2>/dev/null; then
echo "Ну всё, пидрила, игра окончена. SIGKILL на!"
kill -9 <PID>
fi
Но тут, чувак, главное — понимать последствия. SIGKILL — это последний патрон. Это как вырубить питание у компа, на котором идёт запись на диск. Какие могут быть подлянки?
- Утечки: Файлы останутся открытыми, сокеты висеть, память не освобождена.
- Пиздец данным: Если процесс в середине записи в файл или, ёпта, в базу данных транзакцию не завершил — будет тебе каша вместо данных. Целостность — к ебеням.
- Загадочные баги: Потом будешь месяц искать, откуда ноги растут у глюка.
Поэтому в продакшене, прежде чем вмазать kill -9, надо головой подумать (э бошка думай!). Глянуть логи: а что процесс перед смертью бормотал? Проверить iostat — может, он не висит, а просто диск медленный, и он честно пишет. Убить-то недолго, а вот последствия расхлёбывать — овердохуища работы.
Короче, правило простое: сначала SIGTERM, и только если не помогает — SIGKILL. И то, с оглядкой. Не будь распиздяем, который сходу девятку шлёт.