KILL — завершение процессов в Linux/Unix
Введение
Иногда в системе появляется "зависший" процесс, который не реагирует ни на что.
Самое простое и известное средство — команда kill.
Но важно понимать, какие сигналы она посылает и в каких случаях применять каждый из них.
Поиск зависшего процесса
Посмотрим активные сеансы:
- Код: выделить все
w
21:16:47 up 4:03, 2 users, load average: 1.09, 0.59, 0.52
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 20:14 57:19 0.06s 0.06s -bash
root pts/0 sergey6.free-adm 21:13 7.00s 0.03s 0.00s w
Допустим, сеанс на tty1 завис.
Найдём процесс, связанный с ним:
- Код: выделить все
ps -ft tty1
UID PID PPID C STIME TTY TIME CMD
root 4703 699 0 20:14 tty1 00:00:00 -bash
Мягкое завершение (SIGTERM, SIGINT, SIGHUP)
Перед тем как применять "жёсткий" сигнал, попробуем мягкие варианты:
- Код: выделить все
kill 4703 # SIGTERM (по умолчанию)
kill -INT 4703 # Прерывание (Ctrl+C)
kill -HUP 4703 # "Повесить трубку" — используется демонами для перезагрузки конфигурации
Если процесс всё ещё жив, можно убедиться:
- Код: выделить все
ps -p 4703
Жёсткое завершение (SIGKILL)
Если другие сигналы не сработали:
- Код: выделить все
kill -9 4703
Теперь проверяем:
- Код: выделить все
w
21:23:04 up 4:09, 1 user, load average: 0.31, 0.47, 0.49
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 sergey6.free-adm 21:13 0.00s 0.03s 0.00s w
Сеанс на tty1 пропал — процесс завершён.
Почему kill -9 — не панацея
- SIGKILL не перехватывается и не обрабатывается — процесс просто исчезает, не успев очистить ресурсы.
- Это может привести к "мусору" в системе: висячие сокеты, открытые файлы, блокировки, осиротевшие дочерние процессы.
- Иногда даже kill -9 не помогает — если процесс "завис" в ядре (например, ожидает I/O на NFS-точке).
Ситуация | Действие |
Обычный зависший процесс | kill PID (SIGTERM) |
Не реагирует | kill -INT PID, kill -HUP PID |
Не убивается | kill -9 PID — только как крайняя мера |
Не умирает даже от -9 | Проверить состояние системы (D-статус), возможно, завис драйвер или файловая система. Поможет только перезагрузка. |
Дополнительно
- Для массового завершения процессов используйте
- Код: выделить все
pkill
- Код: выделить все
killall
- Чтобы увидеть процессы, "висящие" в D-состоянии (неубиваемые):
- Код: выделить все
ps -eo pid,stat,cmd | grep D
- Для предотвращения подобных ситуаций — следите за корректным завершением сервисов и используйте systemd-юниты с параметром
- Код: выделить все
Restart=
Заключение
kill -9 — инструмент "на крайний случай".
Если применять его с умом, можно безопасно управлять процессами, не рискуя повредить систему.
Главное правило администратора: сначала мягко, потом решительно.