Управление и мониторинг процессов в Linux

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

Введение

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

Вы начнете с запуска фоновой задачи с помощью оператора & и проверки ее статуса командой jobs. Затем вы научитесь инспектировать запущенные процессы через ps, отслеживать активность системы в реальном времени с помощью top и управлять задачами, используя fg, bg и сочетание клавиш Ctrl-Z. В завершение работы вы узнаете, как изменять приоритет процесса с помощью renice и принудительно завершать его командой kill, охватив таким образом весь жизненный цикл управления процессами.

Запуск и просмотр фонового процесса с помощью & и jobs

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

Чтобы запустить команду в фоне, достаточно добавить символ амперсанда (&) в конце строки. Попробуем сделать это на примере команды sleep, которая просто приостанавливает работу на заданное время.

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

sleep 300 &

После нажатия Enter вы увидите вывод, похожий на приведенный ниже, и сразу же вернетесь к приглашению командной строки.

[1] 12345

Оболочка запустила sleep 300 как фоновую задачу. В выводе содержатся два важных идентификатора:

  • [1]: Это ID задачи (job ID). Оболочка присваивает уникальный номер каждой фоновой задаче в текущей сессии.
  • 12345: Это ID процесса (PID). Операционная система присваивает уникальный номер каждому запущенному процессу в системе. Ваш PID будет отличаться от примера.

Теперь, когда процесс запущен, как проверить его статус? Для этого используется команда jobs, которая выводит список всех фоновых задач текущей сессии терминала.

Введите команду jobs в терминале:

jobs

Вы увидите информацию о запущенной команде sleep, ее ID и текущем состоянии.

[1]+  Running                 sleep 300 &

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

Инспекция запущенных процессов с помощью ps

Ранее вы использовали команду jobs, чтобы увидеть фоновые процессы в текущей оболочке. Однако jobs ограничивается только вашей текущей сессией. Чтобы получить полную картину всех процессов в системе, нужен более мощный инструмент: ps (process status). Команда ps делает «снимок» состояния процессов в момент ее запуска.

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

ps

Вывод будет кратким: скорее всего, там окажется только сама оболочка (zsh) и команда ps. Идентификаторы PID в вашей системе будут другими.

  PID TTY          TIME CMD
23882 pts/0    00:00:00 zsh
23953 pts/0    00:00:00 ps

Чтобы увидеть абсолютно все процессы в системе, а не только те, что запущены в вашем терминале, используются специальные флаги. Один из самых популярных наборов — ps aux.

  • a: показывает процессы всех пользователей.
  • u: выводит подробную информацию в удобном для пользователя формате (владелец, % CPU, % памяти и т.д.).
  • x: включает процессы, не привязанные к терминалу.

Длинный список процессов неудобен, если вы ищете что-то конкретное. Мы можем скомбинировать ps с командой grep для фильтрации. Давайте найдем тот самый процесс sleep, который мы запустили ранее.

ps aux | grep sleep

Эта команда отфильтрует вывод ps aux и оставит только строки, содержащие слово "sleep".

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    23962  0.0  0.0  10788  2240 pts/0    S+   11:52   0:00 grep --color=auto sleep

Скорее всего, вы увидите две строки. Первая — это ваш процесс sleep 300. Вторая — это сама команда grep sleep, которая работала в момент формирования списка. Обратите внимание, что PID для sleep 300 (в примере — 23885) совпадает с тем, что вы видели при запуске в фоне.

Другой популярный формат просмотра процессов — ps -ef.

  • -e: выбрать все процессы в системе.
  • -f: полноформатный вывод, включающий важные данные, такие как ID родительского процесса (PPID).

Попробуем этот вариант, снова используя grep.

ps -ef | grep sleep

Формат вывода изменится, но информация останется схожей. Этот вид особенно полезен для понимания иерархии процессов через колонки PID и PPID.

UID        PID  PPID  C STIME TTY          TIME CMD
labex    23885 23882  0 11:50 pts/0    00:00:00 sleep 300
labex    23964 23882  0 11:53 pts/0    00:00:00 grep --color=auto sleep

Теперь вы знаете, как использовать ps для получения моментального снимка системных процессов. Сочетая ее с grep, вы сможете быстро находить и анализировать нужные программы.

Мониторинг системных ресурсов с помощью top

На этом этапе вы познакомитесь с top — мощным инструментом для мониторинга системы в реальном времени. Если ps дает статичную картинку, то top предоставляет динамическое, постоянно обновляемое представление активности системы. Это незаменимо для поиска процессов, которые потребляют слишком много ресурсов прямо сейчас.

Для запуска просто введите top в терминале и нажмите Enter.

top

Интерфейс top займет все окно терминала. Данные будут обновляться каждые несколько секунд.

top - 12:05:15 up 15 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1987.2 total,    985.4 free,    501.8 used,    500.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1325.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  167900  12936   8488 S   0.0   0.6   0:01.15 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
...

Интерфейс top разделен на две основные части:

  • Область сводки сверху показывает общую статистику системы: время работы, количество задач, загрузку процессора (%Cpu(s)) и использование памяти (MiB Mem).
  • Список процессов снизу отображает отдельные программы, по умолчанию отсортированные по потреблению ресурсов процессора (%CPU).

Команда top интерактивна. Вы можете использовать горячие клавиши для изменения отображения:

  1. Сортировка по памяти: Нажмите M (заглавную). Список перестроится по колонке %MEM, показывая самые «прожорливые» до памяти процессы сверху.
  2. Сортировка по процессору: Нажмите P (заглавную). Это вернет сортировку по умолчанию (по колонке %CPU).
  3. Поиск процесса sleep: Попробуйте найти запущенный ранее sleep. Скорее всего, он будет в самом низу списка, так как почти не потребляет ресурсы. Используйте клавиши Стрелка вниз и Стрелка вверх для прокрутки списка.

Когда закончите наблюдение, вы можете выйти из программы.

  1. Выход из top: Нажмите q, чтобы закрыть интерфейс и вернуться в командную строку.

Вы научились использовать top для оперативного контроля за процессами и ресурсами. Это основной инструмент системного администратора для диагностики проблем с производительностью.

Управление задачами с помощью fg, bg и Ctrl-Z

На этом этапе вы научитесь управлять состоянием запущенных задач. Вы уже знаете, как запустить задачу в фоне, но что если вы запустили долгую команду обычным способом и поняли, что вам снова нужен доступ к терминалу? Управление задачами (job control) позволяет перемещать процессы между передним и задним планом, а также приостанавливать и возобновлять их.

Вернемся к нашему процессу sleep 300. Сначала проверьте его статус командой jobs.

jobs

Вы должны увидеть, что задача sleep выполняется в фоновом режиме.

[1]  + running    sleep 300

Теперь переведем эту задачу на передний план. Для этого используйте команду fg (foreground), указав ID задачи с префиксом %. Так как наш ID равен 1, команда будет выглядеть так:

fg %1

Оболочка выведет название команды, и приглашение к вводу исчезнет. Терминал теперь «занят» процессом sleep 300, и вы ждете его завершения.

[1]  + 394 running    sleep 300

Чтобы вернуть управление терминалом, не убивая процесс, его можно остановить (приостановить). Нажмите комбинацию клавиш Ctrl-Z.

Это действие посылает процессу специальный сигнал (SIGTSTP), который приостанавливает его выполнение. Процесс не завершается, он просто «замирает». Вы увидите подтверждающее сообщение, и командная строка снова станет доступной.

[1]  + 394 suspended  sleep 300

Снова проверьте статус задач:

jobs

Теперь статус задачи изменился на "suspended" (приостановлена).

[1]  + suspended  sleep 300

Приостановленную задачу можно возобновить. Это можно сделать либо на переднем плане (fg), либо в фоне (bg). Давайте возобновим ее работу в фоновом режиме.

bg %1

Оболочка подтвердит, что задача снова запущена в фоне.

[1]  + 394 continued  sleep 300

Проверьте статус в последний раз через jobs, чтобы убедиться, что процесс снова в состоянии "Running". Вы успешно перевели процесс из фона вперед, остановили его и вернули обратно в фоновый режим.

Изменение приоритета процесса с помощью renice

На этом этапе вы узнаете, как влиять на приоритет планирования запущенного процесса. В Linux «вежливость» (niceness) процесса определяет, сколько процессорного времени он получает относительно других задач. Значение nice варьируется от -20 (наивысший приоритет) до +19 (наинизший приоритет). По умолчанию большинство процессов запускаются со значением 0. Чем выше значение nice, тем «вежливее» процесс по отношению к другим, так как он охотнее уступает ресурсы процессора.

Мы изменим приоритет процесса sleep, с которым работали. Для этого сначала нужно узнать его ID процесса (PID). Найдем его с помощью ps и grep.

ps aux | grep sleep

Найдите строку с sleep 300 (не саму команду grep) и запомните PID из второй колонки.

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    24101  0.0  0.0  10788  2240 pts/0    S+   12:15   0:00 grep --color=auto sleep

В этом примере PID — 23885. В следующих командах обязательно используйте PID из вашего собственного вывода.

Теперь проверим текущее значение nice (NI) этого процесса. Команда ps с флагом -o позволяет настроить отображаемые колонки.

ps -o pid,ni,cmd -p <YOUR_PID>

Замените <YOUR_PID> на реальный PID вашего процесса. Например: ps -o pid,ni,cmd -p 23885.

    PID  NI CMD
  23885   5 sleep 300

Как и ожидалось, стандартное значение nice (NI) равно 5 (или 0, в зависимости от настроек системы).

Теперь изменим это значение с помощью команды renice. Мы установим значение 10, что сделает процесс менее приоритетным. Обычные пользователи могут только увеличивать значение nice для своих процессов (понижая их приоритет).

renice -n 10 -p <YOUR_PID>

Снова замените <YOUR_PID> на ваш PID. Команда сообщит о старом и новом приоритете.

23885 (process ID) old priority 5, new priority 10

Наконец, убедитесь, что изменения вступили в силу, снова запустив ps:

ps -o pid,ni,cmd -p <YOUR_PID>

В выводе должно отобразиться новое значение nice.

    PID  NI CMD
  23885  10 sleep 300

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

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

На заключительном этапе вы научитесь завершать процессы. Хотя многие программы закрываются сами, часто возникает необходимость вручную остановить задачу, которая больше не нужна, работает некорректно или была запущена временно, как наш sleep. Основной инструмент для этого — команда kill.

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

Вы можете указать процесс через его PID или, если это фоновая задача текущей оболочки, через ID задачи. Использовать ID задачи часто удобнее.

Сначала убедимся, что наш sleep все еще запущен.

jobs

Вы должны увидеть процесс в списке.

[1]+  Running                 sleep 300 &

Теперь используйте команду kill с ID задачи (%1), чтобы завершить ее.

kill %1

После выполнения команды оболочка выведет сообщение о том, что задача была завершена. Это сообщение может появиться сразу или после того, как вы еще раз нажмете Enter.

[1]+  Terminated              sleep 300

Проверим, что процесс действительно исчез. Снова введите jobs.

jobs

Команда не должна ничего вывести, так как активных задач больше нет. Также можно перепроверить через ps.

ps aux | grep sleep

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

В случаях, когда процесс завис и не реагирует на обычный SIGTERM, можно отправить более жесткий сигнал — SIGKILL (номер сигнала 9), который немедленно обрывает работу процесса без возможности очистки данных. Команда выглядела бы так: kill -9 %1. Это следует использовать только в крайнем случае.

Поздравляем! Вы на практике изучили полный жизненный цикл управления процессами в Linux: от запуска в фоне и инспекции через ps и top до управления состоянием, изменения приоритета и финального завершения.

Резюме

В этой лабораторной работе вы освоили фундаментальные навыки управления и мониторинга процессов в среде Linux. Вы начали с запуска процесса в фоновом режиме с помощью оператора & и научились проверять его статус командой jobs. Затем вы изучили способы инспекции всех запущенных процессов через ps для получения таких данных, как PID, и использовали top для динамического наблюдения за ресурсами системы.

Кроме того, вы попрактиковались в управлении задачами: приостанавливали процессы с помощью Ctrl-Z, переводили их в фоновый режим через bg и возвращали на передний план командой fg. Вы также узнали, как корректировать приоритет планирования процессов с помощью renice и как корректно завершать работу программ командой kill.