Введение
В этой лабораторной работе вы изучите ключевые навыки управления и мониторинга процессов в операционной системе Linux. Вы узнаете, как взаимодействовать с процессами, выполняющимися как на переднем, так и на фоновом плане, что даст вам больший контроль над командной строкой и системными ресурсами. Этот практический опыт необходим каждому, кто работает с Linux — от системных администраторов до разработчиков.
Вы начнете с запуска фонового задания с помощью оператора & и просмотра его статуса через jobs. Затем вы изучите запущенные процессы с помощью ps, отследите активность системы в реальном времени с помощью top и попрактикуетесь в управлении заданиями (fg, bg и Ctrl-Z). В завершение работы вы узнаете, как изменять приоритет процесса с помощью renice и завершать его с помощью команды kill, охватив тем самым весь жизненный цикл управления процессами.
Запуск и просмотр фонового процесса с помощью & и jobs
На этом шаге вы научитесь запускать команды в фоновом режиме и просматривать статус фоновых заданий. В оболочке Linux (shell) вы обычно выполняете команду и ждете ее завершения, прежде чем появится приглашение ввода. Такой режим называется выполнением процесса на переднем плане (foreground). Однако для долгих задач бывает удобно запустить их в фоновом режиме (background), чтобы продолжать использовать терминал для других команд.
Чтобы запустить команду в фоновом режиме, просто добавьте амперсанд (&) в конец строки команды. Давайте опробуем это на команде sleep, которая представляет собой утилиту для паузы на заданное время.
Выполните следующую команду, чтобы запустить sleep на 300 секунд в фоновом режиме. Это позволит нам работать с процессом на следующих шагах.
sleep 300 &
После нажатия клавиши Enter вы увидите вывод, похожий на приведенный ниже, а приглашение командной строки вернется немедленно, позволяя вводить новые команды.
[1] 12345
Оболочка запустила команду sleep 300 как фоновое задание. Вывод содержит два ключевых фрагмента информации:
[1]: Это идентификатор задания (job ID). Оболочка назначает уникальный ID каждому фоновому процессу.12345: Это идентификатор процесса (PID). Операционная система назначает уникальный PID каждому запущенному процессу. Ваш PID будет отличаться от примера.
Теперь, когда процесс работает в фоновом режиме, как проверить его статус? Вы можете использовать команду jobs, которая выводит список всех заданий, выполняющихся в фоне для текущей сессии оболочки.
Выполните команду jobs в терминале:
jobs
В выводе отобразится только что запущенная команда sleep, а также ее идентификатор задания и текущий статус.
[1]+ Running sleep 300 &
Вы успешно запустили процесс в фоновом режиме и узнали, как проверять его статус. Это базовый навык управления долго выполняющимися задачами в Linux. На следующих шагах мы рассмотрим, как взаимодействовать с этим фоновым заданием.
Проверка запущенных процессов с помощью ps
На этом шаге вы будете использовать команду ps для проверки запущенных процессов. На предыдущем шаге вы использовали команду jobs для просмотра фонового процесса в текущей оболочке. Однако возможности jobs ограничены вашей сессией. Команда 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 с опциями. Очень распространенная и полезная комбинация — 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, которая выполнялась в момент создания снимка процессов утилитой ps. Обратите внимание, что PID процесса sleep 300 (в этом примере 23885) совпадает с тем, который вы видели при первоначальном запуске команды в фоне.
Еще один популярный формат для просмотра процессов — ps -ef.
-e: выбирает каждый процесс в системе.-f: отображает список в «полном» (full) формате, который включает такую полезную информацию, как идентификатор родительского процесса (PPID).
Давайте попробуем эту команду, также используя grep для поиска нашего процесса sleep.
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 делится на две основные части:
- Общая сводка (summary area) в верхней части отображает системную статистику: время работы (uptime), количество задач, загрузку ЦП (
%Cpu(s)) и использование памяти (MiB Mem). - Список процессов (process list) ниже показывает отдельные процессы, по умолчанию отсортированные по потреблению ЦП (
%CPU).
Интерфейс top является интерактивным. Вы можете нажимать различные клавиши для изменения его поведения. Давайте попробуем некоторые из них:
Нажмите клавишу M (в верхнем регистре), чтобы отсортировать список по использованию памяти. Список будет пересортирован по столбцу %MEM, и процессы, потребляющие больше всего памяти, окажутся наверху.
Нажмите клавишу P (в верхнем регистре), чтобы отсортировать список по использованию ЦП. Это вернет сортировку по умолчанию — по столбцу %CPU.
Попробуйте найти процесс sleep, который вы запустили ранее. Скорее всего, он окажется далеко внизу списка, так как не потребляет процессорное время. Вы можете использовать клавиши со стрелками вверх и вниз для прокрутки списка процессов.
Когда вы закончите наблюдение, вы можете выйти из top в любой момент.
Нажмите q, чтобы закрыть интерфейс top и вернуться к командной строке.
Теперь вы умеете использовать top для получения актуальной информации о процессах и использовании ресурсов системы в реальном времени. Это главная команда для любого системного администратора, занимающегося устранением проблем с производительностью.
Управление заданиями с помощью fg, bg и Ctrl-Z
На этом шаге вы узнаете, как управлять состоянием запущенных заданий. Вы уже знаете, как запустить задание в фоновом режиме, но что делать, если вы запустили долгую команду на переднем плане и поняли, что терминал нужен вам для других дел? Управление заданиями (job control) позволяет перемещать процессы между передним и фоновым планами, а также приостанавливать (останавливать) и возобновлять их работу.
Давайте поработаем с запущенным ранее процессом sleep 300. Сначала проверьте его статус с помощью команды jobs, чтобы убедиться, что он все еще работает.
jobs
Вы должны увидеть ваше задание sleep, выполняющееся в фоновом режиме.
[1] + running sleep 300
Теперь давайте вернем это задание на передний план. Для этого используйте команду fg (foreground), за которой следует идентификатор задания с префиксом %. Поскольку наш ID задания равен 1, команда будет выглядеть так:
fg %1
Оболочка отобразит имя команды с дополнительной информацией о задании, а приглашение ввода пропадет. Теперь терминал «занят» выполнением команды sleep 300 и ждет ее окончания.
[1] + 394 running sleep 300
Чтобы вернуть терминал без уничтожения процесса, вы можете его приостановить. Нажмите комбинацию клавиш Ctrl-Z (удерживайте клавишу Ctrl и нажмите Z).
Это действие отправляет процессу специальный сигнал (SIGTSTP), который приостанавливает его выполнение. Процесс не завершается, он просто временно замораживается. Вы увидите подтверждающее сообщение, и приглашение командной строки вернется.
[1] + 394 suspended sleep 300
Теперь снова проверьте статус заданий:
jobs
В выводе статус задания теперь отображается как "suspended" (приостановлено).
[1] + suspended sleep 300
Остановленное задание можно возобновить. Вы можете возобновить его на переднем плане с помощью fg или в фоновом режиме с помощью bg. Давайте возобновим его в фоновом режиме, используя команду bg.
bg %1
Оболочка подтвердит, что задание снова выполняется в фоновом режиме.
[1] + 394 continued sleep 300
Вы можете в последний раз проверить статус с помощью jobs, чтобы убедиться, что он снова перешел в состояние "Running". Теперь вы успешно переместили процесс из фона на передний план, приостановили его и возобновили в фоновом режиме.
Настройка приоритета процесса с помощью renice
На этом шаге вы научитесь влиять на приоритет планирования запущенного процесса. В Linux показатель «дружелюбности» (niceness) процесса определяет, сколько времени ЦП он получает по сравнению с другими процессами. Значение nice варьируется от -20 (самый высокий приоритет) до +19 (самый низкий приоритет). По умолчанию большинство процессов запускаются со значением nice, равным 0. Более высокое значение nice означает, что процесс «более вежлив» к другим процессам и охотнее уступает им процессорное время.
Мы настроим приоритет процесса sleep, с которым работали ранее. Для этого вам сначала понадобится его идентификатор процесса (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 вашего процесса sleep. Например: ps -o pid,ni,cmd -p 23885.
PID NI CMD
23885 0 sleep 300
Как и ожидалось, значение nice по умолчанию (NI) равно 0.
Теперь давайте изменим это значение с помощью команды renice. Мы увеличим значение nice до 10, что понизит приоритет процесса. Обычные пользователи могут только увеличивать значение nice для своих собственных процессов (делая их приоритет ниже).
renice -n 10 -p <YOUR_PID>
Опять же, замените <YOUR_PID> на PID вашего процесса. Команда выведет старый и новый приоритеты.
23885 (process ID) old priority 0, 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 (terminate), который вежливо просит процесс завершить работу, позволяя ему выполнить необходимые операции по очистке перед выходом.
Вы можете обращаться к процессу либо по его идентификатору процесса (PID), либо, для фоновых заданий в текущей оболочке, по его идентификатору задания (job ID). Использование job ID часто бывает удобнее.
Сначала давайте убедимся, что наше задание sleep все еще работает.
jobs
Вы должны увидеть процесс sleep в списке.
[1]+ Running sleep 300 &
Теперь используйте команду kill вместе с идентификатором задания (%1), чтобы завершить его.
kill %1
После выполнения команды оболочка, скорее всего, выведет в терминал сообщение о том, что задание было завершено. Это сообщение может появиться сразу же или после повторного нажатия клавиши Enter.
[1]+ Terminated sleep 300
Давайте убедимся, что процесс действительно исчез. Снова выполните команду jobs.
jobs
Теперь эта команда не должна выдавать никакого вывода, так как в текущей сессии оболочки больше нет активных заданий. Вы также можете использовать ps для дополнительной проверки.
ps aux | grep sleep
Единственная строка, которую вы можете увидеть — это сама команда grep sleep. Исходный процесс sleep 300 больше не запущен.
В тех случаях, когда процесс завис и не реагирует на стандартный сигнал SIGTERM, вы можете отправить более жесткий сигнал SIGKILL (номер сигнала 9), который немедленно уничтожает процесс, не давая ему шанса на очистку. Для этого используется команда kill -9 %1. Это средство следует использовать только в крайнем случае.
Поздравляем! Вы освоили весь жизненный цикл базового управления процессами в Linux: запуск процесса в фоновом режиме, его мониторинг с помощью ps и top, управление заданиями, настройку приоритета и, наконец, завершение работы.
Резюме
В этой лабораторной работе вы изучили ключевые навыки управления и мониторинга процессов в среде Linux. Вы начали с запуска процесса в фоновом режиме с помощью оператора & и просмотра его статуса с помощью команды jobs. Затем вы научились исследовать все запущенные процессы с помощью ps для поиска таких деталей, как идентификатор процесса (PID), а также использовать top для мониторинга использования системных ресурсов и активных процессов в реальном времени.
Кроме того, вы потренировались в управлении заданиями: приостанавливали процесс переднего плана с помощью Ctrl-Z, переводили его в фоновый режим с помощью bg и возвращали обратно на передний план с помощью fg. Вы также узнали, как настраивать приоритет планирования процесса с помощью renice и как корректно завершать процесс с помощью команды kill, указав его PID.



