kill

В мире Linux и других Unix-подобных систем управление процессами — фундаментальный навык. Когда программа зависала или начала потреблять слишком много ресурсов, на помощь приходит команда kill. Вопреки своему названию, ее основная задача — не просто «убивать» процессы, а отправлять им сигналы. В этой статье мы подробно разберем, как использовать kill, все ее ключевые сигналы и приведем практические примеры.

Что такое команда kill?

kill — это встроенная утилита в командной строке Linux, предназначенная для взаимодействия с запущенными процессами путем отправки им определенных сигналов. По умолчанию, если не указан тип сигнала, отправляется сигнал SIGTERM (15), который корректно запрашивает завершение процесса.

Bash
kill [опции] <PID>

где PID (Process ID) — уникальный идентификатор процесса.

Как найти PID процесса

Прежде чем что-то «убивать», нужно найти жертву. Для этого есть несколько инструментов.

1. ps (process status)

Команда ps показывает список активных процессов.

Bash
ps aux | grep firefox

Эта команда найдет все процессы, связанные с Firefox, и покажет их PID.

2. pgrep (process grep)

Более простой способ найти PID по имени процесса.

Bash
pgrep firefox

Команда просто выведет число — PID процесса Firefox.

3. top / htop

Интерактивные мониторы системы. В них можно посмотреть список процессов и их PID в реальном времени. htop является более современной и удобной альтернативой.

Основные сигналы команды kill

Сигналы — это основа работы kill. Вот самые важные из них:

СигналНомерОписание
SIGHUP1«Зависание». Часто используется для перезагрузки конфигурации процесса.
SIGINT2«Прерывание» (аналог Ctrl+C в терминале).
SIGQUIT3«Выход» (аналог Ctrl+).
SIGKILL9Немедленное уничтожение процесса. Ядро останавливает процесс без возможности его обработать сигнал.
SIGTERM15Корректное завершение (по умолчанию). Процессу отправляется запрос на завершение, который он может обработать (закрыть файлы, сохранить данные).
SIGSTOP19Приостановка выполнения процесса (аналог Ctrl+Z).
SIGCONT18Продолжение выполнения приостановленного процесса.

Важно: Сигналы SIGKILL (9) и SIGSTOP (19) невозможно перехватить или проигнорировать. Процесс будет завершен или остановлен ядром системы принудительно.

Практические примеры использования kill

Пример 1: Корректное завершение процесса (SIGTERM)

Допустим, мы нашли PID текстового редактора Gedit: 1256.

Bash
# Отправляем сигнал SIGTERM (по умолчанию, поэтому можно не указывать)
kill 1256

# Или то же самое, но с явным указанием сигнала
kill -15 1256

Процесс получит запрос на завершение и закроет все файлы перед выходом.

Пример 2: Принудительное завершение (SIGKILL)

Если процесс не реагирует на SIGTERM (например, завис), используйте SIGKILL.

Bash
# Принудительно "убиваем" процесс с PID 1256
kill -9 1256
# Или эквивалентная запись
kill -SIGKILL 1256

Это последнее средство, так как процесс не успеет сохранить данные или корректно завершить работу.

Пример 3: Перезагрузка конфигурации (SIGHUP)

Многие демоны (фоновые процессы, например, nginx) перечитывают свои конфигурационные файлы при получении сигнала SIGHUP.

Bash
# Находим PID nginx
pgrep nginx
# Предположим, он вернул 881
kill -1 881
# Или более читаемо
kill -SIGHUP 881

После этого Nginx продолжит работу с обновленными настройками.

Пример 4: Приостановка и возобновление процесса

Это полезно для освобождения ресурсов без полного завершения работы.

Bash
# Приостанавливаем процесс с PID 2250
kill -SIGSTOP 2250

# Возобновляем его работу
kill -SIGCONT 2250

Полезные альтернативы: killall и pkill

Иногда удобнее работать не с PID, а с именем процесса.

Команда killall

Завершает все процессы с указанным именем.

Bash
# Корректно завершаем все процессы firefox
killall firefox

# Принудительно завершаем все процессы с именем "my_script.sh"
killall -9 my_script.sh

Команда pkill

Еще более мощный инструмент. Позволяет завершать процессы по шаблону имени.

Bash
# Завершаем все процессы, имена которых начинаются на "chrome"
pkill chrome

# Можно использовать более сложные шаблоны
pkill -f "python my_long_script.py" # -f ищет по всей командной строке

Частые ошибки и рекомендации

  1. Всегда сначала используйте SIGTERM (kill <PID>). Дайте процессу шанс завершиться правильно. Прибегайте к SIGKILL только в крайних случаях.
  2. Не злоупотребляйте sudo kill. Завершение системных процессов от root может привести к нестабильной работе системы.
  3. Проверяйте PID. Завершение не того процесса может иметь неприятные последствия. Всегда double-check.
  4. Сигнал SIGKILL не дает 100% гарантии. В редких случаях процесс может оказаться в состоянии D (uninterruptible sleep), обычно из-за проблем с железом или драйверами, и даже kill -9 будет бессилен. В таком случае часто помогает только перезагрузка.

Заключение

Команда kill — это не просто «убийца» процессов, а точный инструмент для управления ими. Понимание различий между сигналами, особенно между SIGTERM и SIGKILL, — ключ к грамотной администрации Linux-систем. Используйте SIGTERM для вежливого запроса на закрытие и оставляйте SIGKILL для тех редких случаев, когда процессы перестают на что-либо реагировать.

Освойте связку команд ps/pgrep -> kill, и вы получите полный контроль над всеми работающими программами в вашей системе.