Завершение процессов с помощью kill, killall и pkill
В этом шаге вы узнаете, как завершать процессы с помощью команд kill, killall и pkill. Эти команды необходимы для управления системными ресурсами и остановки некорректно работающих приложений.
Процессы в Linux реагируют на сигналы. Сигнал — это программное прерывание, посылаемое процессу. Разные сигналы имеют разное значение, например, завершение процесса, приостановление его или загрузка новой конфигурации.
Сначала давайте разберёмся с некоторыми фундаментальными сигналами управления процессами:
- SIGTERM (15): Сигнал по умолчанию, отправляемый командой
kill. Это «вежливый» запрос на завершение. Процесс может перехватить этот сигнал, выполнить необходимые действия по очистке и затем завершиться.
- SIGKILL (9): «Неблокируемый» сигнал, который принудительно завершает процесс немедленно. Процесс не может игнорировать или обрабатывать этот сигнал. Используйте его в крайнем случае.
- SIGHUP (1): Часто используется для указания процессу перезагрузить файлы конфигурации без перезапуска.
- SIGINT (2): Отправляется при нажатии
Ctrl+C, обычно используется для прерывания процесса в переднем плане.
- SIGSTOP (19): Приостанавливает процесс. Он не может быть заблокирован или обработан.
- SIGCONT (18): Возобновляет приостановленный процесс.
Вы можете перечислить все доступные сигналы и их номера, используя kill -l:
kill -l
Вы увидите список сигналов, похожий на этот:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...output omitted...
Использование kill
Команда kill отправляет указанный сигнал процессу, идентифицированному по его идентификатору процесса (PID).
Давайте создадим несколько фоновых процессов для практики завершения. Мы снова будем использовать команды sleep.
sleep 300 &
sleep 301 &
sleep 302 &
Теперь используйте jobs, чтобы увидеть их номера задач и PID:
jobs
[1] 1234
[2] 1235
[3] 1236
(Обратите внимание: ваши PID будут отличаться.)
Давайте найдём PID первого процесса sleep. Вы можете использовать ps aux | grep sleep и найти PID, связанный с sleep 300.
ps aux | grep sleep
Вы увидите вывод, похожий на этот. Определите PID для sleep 300. Например, если PID равен 1234:
labex 1234 0.0 0.0 2200 680 pts/0 S HH:MM 0:00 sleep 300
labex 1235 0.0 0.0 2200 680 pts/0 S HH:MM 0:00 sleep 301
labex 1236 0.0 0.0 2200 680 pts/0 S HH:MM 0:00 sleep 302
labex 1237 0.0 0.0 6000 1000 pts/0 S+ HH:MM 0:00 grep sleep
Чтобы завершить sleep 300 с помощью сигнала SIGTERM по умолчанию, используйте kill и его PID. Замените 1234 на фактический PID, который вы нашли:
kill 1234
Вы можете увидеть сообщение вроде [1]+ Terminated sleep 300. Проверьте, что он исчез, используя jobs или ps aux | grep sleep:
jobs
[2]- Running sleep 301 &
[3]+ Running sleep 302 &
Теперь давайте принудительно завершим sleep 301 с помощью SIGKILL. Найдите его PID (например, 1235) и используйте kill -9 или kill -SIGKILL:
kill -9 1235
Вы, скорее всего, увидите [2]- Killed sleep 301. Снова проверьте:
jobs
[3]+ Running sleep 302 &
Использование killall
Команда killall завершает процессы по их имени, а не по PID. Она отправляет сигнал всем процессам, которые соответствуют указанному имени команды.
Давайте создадим ещё несколько процессов sleep:
sleep 303 &
sleep 304 &
sleep 305 &
Проверьте, что они запущены:
jobs
[3] Running sleep 302 &
[4] Running sleep 303 &
[5] Running sleep 304 &
[6] Running sleep 305 &
Теперь используйте killall, чтобы завершить все процессы sleep. По умолчанию killall отправляет SIGTERM.
killall sleep
Вы увидите сообщения о завершении каждого процесса sleep. Проверьте, что все процессы sleep исчезли:
jobs
(no output)
Использование pkill
Команда pkill похожа на killall, но предоставляет более расширенные критерии выбора, включая сопоставление по шаблону имён команд, идентификаторам пользователей, группам и управляющим терминалам. Она очень мощна для нацеливания на определённые наборы процессов.
Давайте создадим новые процессы sleep для pkill:
sleep 306 &
sleep 307 &
sleep 308 &
Проверьте, что они запущены:
jobs
[1] Running sleep 306 &
[2] Running sleep 307 &
[3] Running sleep 308 &
Чтобы завершить все процессы sleep, принадлежащие текущему пользователю (labex), вы можете использовать pkill -u labex sleep:
pkill -u labex sleep
Эта команда завершит все процессы sleep, принадлежащие пользователю labex.
Проверьте, что все процессы sleep исчезли:
jobs
(no output)
Вы также можете использовать pkill с шаблоном. Например, если у вас есть процессы с именами my_app_v1 и my_app_v2, вы можете завершить оба с помощью pkill my_app.
Эти команды предоставляют гибкие способы управления и завершения процессов, от нацеливания на один процесс по его PID до завершения нескольких процессов на основе их имени или других атрибутов. Всегда будьте осторожны при использовании kill -9 или SIGKILL, так как это может привести к потере данных, если у процесса нет возможности выполнить очистку.