Рассказываем, как завершить работу одного или нескольких процессов в разных дистрибутивах Linux.
Сигналы завершения процессов в Linux
В Linux управление процессами осуществляется с помощью специальных сигналов. Каждый сигнал задает определенный набор параметров и моделей поведения для ядра и запущенных программ. Например, завершить выполнение определенных задач, удалить все временные файлы или закончить обрабатывать полученные данные. Системе Linux и запущенным процессам эти сигналы хорошо знакомы, и они умеют на них правильно реагировать. Поэтому они работают по всей системе без ограничений.
Эти сигналы обычно посылает сама система, но это может делать и администратор компьютера. Правда, перед этим ему стоит ознакомиться с тем, к каким последствиям может привести халатное отношение к командам завершения процессов.
- SIGINT — это относительно щадящий сигнал завершения работы. Его можно послать, одновременно нажав клавиши Ctrl + C. Этот сигнал разрешает процессу завершить выполнение своей работы, удалить после себя весь мусор и спокойно уйти на покой.
- SIGQUIT — этот сигнал также пытается убить процесс, предлагая ему закончить свою работу, но процесс может проигнорировать этот запрос и тут же закрыться. При этом SIGQUIT формирует некий слепой (дамп памяти) программы для восстановления данных при повторном запуске. Чтобы его послать, нужно одновременно нажать клавиши Ctrl + /.
- SIGHUP — этот сигнал отправляется автоматически, когда теряется интернет-соединение между управляющим компьютером и сервером.
- SIGTERM — сигнал, убивающий процесс, который обрабатывается программой.
- SIGKILL — убивает процесс, игнорируя зависимости, которые остаются активными.
Как завершить процесс в Linux
Как я уже рассказывал раньше, процесс можно убить, используя определенные сочетания клавиш в терминале.
Допустим, находясь в терминале, вы запустили собственный node.js сервер и хотите прекратить его работу (или же начали загрузку какого-то пакета). Эти задачи можно прервать, нажав одну из двух комбинаций клавиш:
- Ctrl + C — чтобы отправить сигнал SIGINT и завершить процесс в щадящем режиме.
- Ctrl + / — чтобы дать процессу возможность игнорировать завершение сторонних задач.
С помощью команды kill
Если нужно передать сигнал завершения процесса какой-то программе, которая работает в фоновом режиме, можно воспользоваться командной kill.
У этой команды следующая структура: сначала отправляется сама команда kill, затем указывается тип сигнала (например -TERM), а следом номер процесса, так называемый process ID.
$ kill -TERM 10528
С первыми двумя составляющими команды все понятно. kill никогда не меняется, вместо -TERM можно вписать другой сигнал, а вот PID сначала нужно отыскать.
Для этого используется команда ps aux | grep название программы.
Вот несколько примеров:
- Открываем терминал.
- Вводим туда команду ps aux | grep ping.
- Находим процесс с нужным номером.
- Убиваем его командой kill — TERM.
Вот та же самая процедура, но более наглядно. В одном окне терминала запущена программа ping, и в реальном времени она посылает сигналы на сайт. Во втором окне я прописал команду ps aux | grep ping. Терминал выдал мне список процессов с таким названием. Я нашел среди них свой, он запущен под Process ID 8823.
Теперь я могу закрыть этот процесс, введя команду kill -TERM 8823.
И мне даже не нужно проверять, действительно он завершился или нет. В оболочке Gnome 3 в центре уведомлений тут же появилось соответствующее сообщение.
С помощью команды pkill
pkill — это не отдельная программа, а надстройка над kill. Разница между ними заключается в том, что для запуска первой не требуется сначала выяснять PID. Программа pkill анализирует содержимое директории proc, сравнивает введенное название программы с PID, который указан там, и затем посылает сигнал завершения работы по указанному адресу.
По описанию процесс кажется замысловатым, но по факту для конечного пользователя все выглядит просто.
- Открываем терминал.
- Вводим команду pkill, а следом за ней название процесса, который нужно убить.
- Для примера введем команду pkill ping.
- И все.
С помощью команды killall
Описанные выше методы хорошо работают, если нужно завершить один процесс. А когда перед нами условный Google Chrome, создавший по процессу на каждую вкладку, то приходится туго. Закрывать все вручную сложновато. Для этого и нужна команда killall.
У нее такой же синтаксис, как у pkill. Просто вводите команду, а следом за ней название программы, которую нужно убить.