Завершение процессов в Linux

LinuxBeginner
Практиковаться сейчас

Введение

В этом лабораторном занятии вы научитесь основным навыкам управления процессами в Linux, сосредоточившись на том, как определять и завершать процессы. Управление процессами является фундаментальным навыком для любого пользователя или администратора Linux, так как оно позволяет эффективно управлять системными ресурсами.

Вы научитесь использовать команду ps для определения запущенных процессов и команду kill для их завершения при необходимости. Эти инструменты являются обязательными для поддержания производительности системы и решения проблем с нереагирующими приложениями.

К концу этого лабораторного занятия вы сможете определять процессы, понимать их атрибуты и завершать их различными методами. Эти навыки ценны для устранения неполадок и эффективного управления системами Linux.

Идентификация процессов

В Linux каждая запущенная программа или приложение считается процессом. Каждый процесс имеет уникальный идентификатор, называемый идентификатором процесса (Process ID, PID). Прежде чем вы сможете завершить процесс, вам нужно определить его по его PID.

Начнем с изучения того, как просматривать запущенные процессы с помощью команды ps. Эта команда отображает информацию о активных процессах в вашей системе.

Сначала откройте терминал в среде виртуальной машины LabEx и выполните следующую команду:

ps

Вы увидите базовый список процессов, запущенных в текущей сессии терминала. Вывод должен выглядеть примерно так:

  PID TTY          TIME CMD
 2104 pts/0    00:00:00 zsh
 2116 pts/0    00:00:00 ps

Этот вывод показывает:

  • PID: Номер идентификатора процесса
  • TTY: Тип терминала, на котором запущен процесс
  • TIME: Количество времени ЦП, использованное процессом
  • CMD: Команда, которая запустила процесс

Чтобы увидеть более полный список всех процессов, запущенных на системе, используйте следующую команду с дополнительными параметрами:

ps -aux

Параметры означают:

  • -a: Показать процессы всех пользователей
  • -u: Отобразить подробный формат, ориентированный на пользователя
  • -x: Включить процессы без управляющего терминала

Вывод будет намного длиннее и более подробным, показывая все процессы, запущенные на системе:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1 167936 11876 ?        Ss   10:30   0:01 /sbin/init
root           2  0.0  0.0      0     0 ?        S    10:30   0:00 [kthreadd]
...
labex       2104  0.0  0.1  11108  5456 pts/0    Ss   10:35   0:00 zsh
labex       2130  0.0  0.0   9828  3384 pts/0    R+   10:36   0:00 ps -aux

Теперь создадим простой фоновый процесс, который мы сможем использовать для практики:

sleep 300 &
sleep_pid=$!

Эта команда запускает процесс, который будет "спать" (ничего не делать) в течение 300 секунд (5 минут). Символ & запускает его в фоновом режиме, а $! захватывает PID последнего запущенного фонового процесса.

Убедимся, что процесс запущен:

echo "The sleep process ID is: $sleep_pid"
ps | grep sleep

Вы должны увидеть вывод, похожий на следующий:

The sleep process ID is: 2135
 2135 pts/0    00:00:00 sleep

Теперь вы знаете, как определить процессы и найти их PID. На следующем шаге мы научимся завершать этот процесс.

Завершение процессов с помощью команды 'kill'

Теперь, когда вы определили процесс и его PID, вы можете научиться завершать его с помощью команды kill. Команда kill отправляет сигнал процессу, инструкцию ему завершиться.

Базовый синтаксис команды kill выглядит следующим образом:

kill [options] <PID>

Завершим процесс sleep, который мы создали на предыдущем шаге. Мы сохранили его PID в переменной $sleep_pid. Используйте следующую команду для завершения этого процесса:

kill $sleep_pid

Если вы забыли PID, вы можете снова найти его с помощью следующей команды:

ps | grep sleep

После выполнения команды kill убедитесь, что процесс был завершен:

ps | grep sleep

Если процесс был успешно завершен, вы не должны увидеть никакого вывода или в выводе должен быть только сам процесс grep. Это означает, что процесс sleep больше не запущен.

Если вы хотите быть уверены, вы можете снова использовать команду ps для вывода списка всех процессов:

ps -aux | grep sleep

Возможно, это покажет что-то вроде этого:

labex       2156  0.0  0.0   7236   720 pts/0    S+   10:40   0:00 grep --color=auto sleep

Единственным показанным процессом является команда grep сама по себе, что указывает на то, что процесс sleep был завершен.

По умолчанию команда kill отправляет сигнал TERM (завершение) процессу, что позволяет процессу корректно завершиться после выполнения любых операций по очистке. В большинстве случаев этого достаточно для завершения процесса.

Теперь вы успешно определили и завершили процесс с помощью команды kill, что является фундаментальным навыком для управления процессами в Linux.

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

В Linux команда kill может отправлять различные типы сигналов процессам, а не только сигналы завершения. Понимание этих сигналов позволяет вам лучше контролировать процесс завершения.

Сначала посмотрим все доступные сигналы, запустив следующую команду:

kill -l

Эта команда выведет список всех сигналов, которые может отправить команда kill. Вывод будет выглядеть примерно так:

 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
...

Наиболее часто используемые сигналы:

  • SIGTERM (15): Сигнал по умолчанию, отправляемый командой kill. Просит процесс корректно завершиться.
  • SIGKILL (9): Принудительно завершает процесс немедленно. Используйте, если процесс не реагирует на SIGTERM.
  • SIGHUP (1): Традиционно используется для сброса или перезагрузки конфигурационных файлов.
  • SIGINT (2): Отправляется, когда вы нажимаете Ctrl+C в терминале.

Создадим еще один процесс sleep для практики:

sleep 300 &
sleep_pid=$!
echo "The new sleep process ID is: $sleep_pid"

Теперь отправим конкретный сигнал процессу, используя номер сигнала:

kill -15 $sleep_pid

Это эквивалентно команде kill по умолчанию, так как она отправляет SIGTERM (сигнал 15).

Убедимся, что процесс был завершен:

ps | grep sleep

Создадим еще один процесс sleep, чтобы продемонстрировать сигнал SIGKILL:

sleep 300 &
sleep_pid=$!
echo "The third sleep process ID is: $sleep_pid"

Теперь используем сигнал SIGKILL, чтобы принудительно завершить процесс:

kill -9 $sleep_pid

Убедимся, что процесс был завершен:

ps | grep sleep

Сигнал SIGKILL (9) является "спасательным кругом", потому что:

  1. Он не позволяет процессу выполнить очистку после себя.
  2. Он может оставить ресурсы в неконсистентном состоянии.
  3. Он может привести к потере данных, если процесс записывал данные.

Всегда сначала попробуйте использовать SIGTERM, и только используйте SIGKILL, если процесс не реагирует на SIGTERM.

Расширенное управление процессами

Linux предоставляет дополнительные команды для управления процессами помимо базовых команд ps и kill. Эти инструменты обеспечивают большую гибкость и удобство при идентификации и завершении процессов.

Команда pgrep

Команда pgrep позволяет искать процессы по имени, не требуя визуального просмотра вывода команды ps:

pgrep sleep

Эта команда найдет все процессы, в имени которых есть "sleep", и выведет их PID.

Команда pkill

Команда pkill объединяет функциональность команд pgrep и kill — она ищет процессы по имени и отправляет им сигнал:

## Запустить два процесса sleep
sleep 300 &
sleep 300 &

## Завершить все процессы sleep
pkill sleep

Убедитесь, что все процессы sleep были завершены:

ps | grep sleep

Команда killall

Подобно команде pkill, команда killall завершает процессы по имени:

## Запустить еще два процесса sleep
sleep 300 &
sleep 300 &

## Завершить все процессы sleep
killall sleep

Проверьте еще раз:

ps | grep sleep

Приоритет процессов с помощью nice и renice

Linux также позволяет контролировать приоритет процессов с помощью команд nice и renice.

Запустим процесс с более низким приоритетом:

nice -n 10 sleep 300 &

Значение nice может быть в диапазоне от -20 (наивысший приоритет) до 19 (наименьший приоритет). По умолчанию оно равно 0. Только пользователь root может устанавливать отрицательные значения nice.

Вы можете изменить приоритет запущенного процесса с помощью команды renice:

sleep_pid=$!
echo "Sleep process ID with lower priority: $sleep_pid"
renice -n 15 -p $sleep_pid

Проверим новый приоритет:

ps -o pid,nice,cmd -p $sleep_pid

Наконец, завершим этот процесс:

kill $sleep_pid

Эти продвинутые команды управления процессами обеспечивают более эффективные способы управления множеством процессов и контроля системных ресурсов, что особенно полезно на загруженных системах или при устранении неполадок с производительностью.

Резюме

В этом практическом занятии вы изучили основные навыки управления процессами в Linux, которые ценны для системного администрирования и устранения неполадок:

  1. Идентификация процессов: Вы узнали, как использовать команду ps для вывода списка запущенных процессов и нахождения их идентификаторов процессов (PID).

  2. Завершение процессов: Вы практиковались в использовании команды kill для отправки сигналов завершения процессам по их PID.

  3. Понимание сигналов команды kill: Вы изучили различные типы сигналов, которые можно отправить процессам, включая SIGTERM (15) для корректного завершения и SIGKILL (9) для принудительного завершения.

  4. Продвинутое управление процессами: Вы узнали о более мощных инструментах, таких как pgrep, pkill и killall, для поиска и завершения процессов по имени, а также о том, как контролировать приоритет процессов с помощью nice и renice.

Эти навыки позволяют вам:

  • Эффективно отслеживать системные процессы
  • Завершать нереагирующие приложения
  • Управлять системными ресурсами
  • Устранять неполадки с производительностью

Управление процессами является фундаментальным аспектом системного администрирования в Linux, и команды, которые вы изучили в этом практическом занятии, ежедневно используются системными администраторами и пользователями Linux для поддержания производительности и стабильности системы.