Введение
В этом лабораторном практикуме вы получите практический опыт мониторинга и управления процессами Linux, что является фундаментальным навыком для любого системного администратора или разработчика. Вы научитесь понимать состояния и жизненные циклы процессов с помощью команд ps и top, управлять фоновыми и передними задачами, а также эффективно завершать процессы с помощью kill, killall и pkill. Кроме того, вы изучите, как контролировать нагрузку системы и использование ЦП с помощью uptime и lscpu, и подробно анализировать активность процессов с помощью top. Этот практикум снабдит вас необходимыми инструментами и знаниями для эффективного управления процессами и поддержания здоровья системы на RHEL.
Понимание состояний и жизненного цикла процессов с помощью ps и top
В этом шаге вы узнаете о состояниях процессов Linux и их жизненном цикле. Понимание состояний процессов имеет решающее значение для эффективного мониторинга и управления системными ресурсами. Вы будете использовать команды ps и top для наблюдения за процессами и их состояниями.
Каждый процесс в Linux имеет состояние, описывающее его текущую активность. Эти состояния определяются ядром и указывают, находится ли процесс в работе, ожидании, приостановлен или в другом состоянии.
Начнём с изучения состояний процессов с помощью команды ps. Команда ps отображает моментальный снимок текущих процессов.
Сначала откройте терминал. Вы можете сделать это, щелкнув по значку терминала на рабочем столе или нажав Ctrl+Alt+T. Ваша текущая рабочая директория — ~/project.
Чтобы увидеть все запущенные процессы на вашей системе, включая те, у которых нет управляющего терминала, используйте команду ps aux. Опции aux отображают процессы, принадлежащие всем пользователям (a), процессы без управляющего терминала (x), и показывают формат, ориентированный на пользователя (u).
ps aux
Вы увидите длинный список процессов. Обратите внимание на столбец STAT, который показывает состояние каждого процесса. Распространённые состояния, которые вы можете наблюдать, включают:
R: Запущенный или готовый к запуску (в процессоре или ожидает запуска)S: Прерывимое ожидание (ожидание завершения события)D: Непрерывимое ожидание (ожидание ввода-вывода, не может быть прервано)T: Приостановленный (приостановлен сигналом)Z: Зомби (процесс завершён, но родительский процесс ещё не получил его код завершения)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 171820 16140 ? Ss HH:MM 0:01 /usr/lib/systemd/systemd ...
root 2 0.0 0.0 0 0 ? S HH:MM 0:00 [kthreadd]
labex 3448 0.0 0.2 266904 3836 pts/0 R+ HH:MM 0:00 ps aux
...output omitted...
Далее, давайте воспользуемся командой ps -ef. Эта команда предоставляет полный список (f) всех процессов (e), показывая больше деталей, такие как идентификатор родительского процесса (PPID), использование процессора (C), время запуска (STIME) и команду (CMD).
ps -ef
Этот вывод часто используется для просмотра отношений «родитель-дочерний» между процессами, хотя он не отображает явно структуру дерева.
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 HH:MM ? 00:00:01 /usr/lib/systemd/systemd ...
root 2 0 0 HH:MM ? 00:00:00 [kthreadd]
root 3 2 0 HH:MM ? 00:00:00 [rcu_gp]
...output omitted...
Для визуализации иерархии процессов вы можете использовать опцию ps --forest. Это отображает процессы в виде дерева, что упрощает понимание, какие процессы породили другие.
ps --forest
Эта команда особенно полезна для отладки и понимания структуры различных служб и приложений в вашей системе.
PID TTY TIME CMD
2768 pts/0 00:00:00 bash
5947 pts/0 00:00:00 \_ sleep 10000
6377 pts/0 00:00:00 \_ ps --forest
...output omitted...
Теперь давайте рассмотрим команду top, которая предоставляет динамический, реальный вид работающей системы. Она отображает сводку информации о системе и список процессов или потоков, которые в данный момент управляются ядром Linux.
Запустите команду top:
top
Вы увидите интерактивный вывод. Верхняя часть предоставляет сводку информации о системе, включая время работы, среднюю нагрузку, сводку задач, статистику процессора и использование памяти. Нижняя часть отображает отдельные процессы, отсортированные по умолчанию по использованию процессора.
В выводе top наблюдайте столбец S для состояний процессов, аналогично ps. Вы также можете увидеть %CPU (процент использования процессора) и %MEM (процент использования памяти) для каждого процесса.
top - HH:MM:SS up DD min, X users, load average: X.XX, X.XX, X.XX
Tasks: XXX total, X running, XXX sleeping, X stopped, X zombie
%Cpu(s): X.X us, X.X sy, X.X ni, XX.X id, X.X wa, X.X hi, X.X si, X.X st
MiB Mem : XXXX.X total, XXXX.X free, XXX.X used, XXX.X buff/cache
MiB Swap: XXXX.X total, XXXX.X free, X.X used. XXXX.X avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
XXXX labex 20 0 XXXXXX XXXX XXXX R X.X X.X 0:00.0X top
...output omitted...
Пока top работает, вы можете нажать q, чтобы выйти и вернуться к приглашению терминала.
Понимание этих команд и предоставляемой ими информации является фундаментальным для мониторинга и устранения неполадок процессов в системе Linux.
Управление фоновыми и передними задачами
В этом шаге вы узнаете, как управлять задачами в фоновом и переднем планах в вашей сессии оболочки. Это фундаментальный навык для эффективного использования командной строки, позволяющий запускать длительные задачи без блокировки терминала.
«Задача» в контексте оболочки относится к команде или цепочке команд, которые оболочка управляет. Вы можете запускать задачи в фоновом режиме, переводить их в передний план или приостанавливать их.
Начнём с запуска простой команды в фоновом режиме. Мы будем использовать команду sleep, которая просто ожидает определённое количество времени.
Чтобы запустить sleep 10000 (ожидание 10000 секунд) в фоновом режиме, добавьте амперсанд (&) к команде:
sleep 10000 &
При нажатии Enter оболочка сразу вернётся к приглашению, а команда sleep будет выполняться в фоновом режиме. Вы увидите вывод, похожий на этот, показывающий номер задачи и её идентификатор процесса (PID):
[1] 5947
[1] указывает, что это задача номер 1 в вашей текущей сессии оболочки, а 5947 — PID процесса sleep.
Чтобы просмотреть список всех задач, которые в данный момент управляет ваша оболочка, используйте команду jobs:
jobs
Вы должны увидеть команду sleep в списке как запущенную фоновую задачу:
[1]+ Running sleep 10000 &
Символ + рядом с [1] указывает, что это текущая задача (над которой будет выполняться действие по умолчанию, если вы не указали номер задачи).
Теперь давайте переведём эту фоновую задачу в передний план. Это означает, что задача снова получит контроль над вашим терминалом. Используйте команду fg и номер задачи (с префиксом %):
fg %1
Команда sleep 10000 теперь находится в переднем плане. Ваш терминал будет занят этой командой, и вы не получите приглашение, пока она не завершится или не будет приостановлена.
sleep 10000
Пока команда выполняется в переднем плане, вы можете перевести её в фоновый режим и приостановить её, нажав Ctrl+Z. Это отправляет сигнал SIGTSTP процессу.
Нажмите Ctrl+Z сейчас:
^Z
Вы увидите вывод, указывающий, что задача была остановлена и переведена в фоновый режим:
[1]+ Stopped sleep 10000
Теперь, если вы снова выполните jobs, вы увидите, что команда sleep находится в состоянии Stopped:
jobs
[1]+ Stopped sleep 10000
Чтобы возобновить остановленную фоновую задачу, вы можете использовать команду bg и номер задачи. Это запустит задачу снова в фоновом режиме.
bg %1
Задача снова будет выполняться в фоновом режиме:
[1]+ sleep 10000 &
Наконец, давайте завершим фоновую задачу. Вы можете завершить фоновую задачу с помощью команды kill с её PID или переведя её в передний план и завершив (например, с помощью Ctrl+C). Сейчас давайте переведём её в передний план и завершим.
fg %1
Теперь, когда sleep 10000 находится в переднем плане, нажмите Ctrl+C, чтобы завершить её. Это отправляет сигнал SIGINT процессу.
^C
Вы увидите сообщение, указывающее, что задача была завершена:
[1]+ Terminated sleep 10000
Если вы снова выполните jobs, вы должны увидеть, что задач больше нет:
jobs
(no output)
Это демонстрирует базовый рабочий процесс управления задачами в фоновом и переднем планах, что важно для многозадачности в терминале.
Завершение процессов с помощью 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, так как это может привести к потере данных, если у процесса нет возможности выполнить очистку.
Мониторинг нагрузки системы и использования процессора с помощью uptime и lscpu
В этом шаге вы узнаете, как отслеживать среднюю нагрузку системы и использование процессора с помощью команд uptime и lscpu. Понимание этих метрик имеет решающее значение для оценки производительности системы и выявления потенциальных узких мест.
Понимание средней нагрузки с помощью uptime
Команда uptime предоставляет краткий обзор времени работы системы, количества подключённых пользователей и, что наиболее важно, средней нагрузки системы. Средняя нагрузка показывает среднее количество процессов, находящихся в состоянии готовности к выполнению или в неперерываемом состоянии в течение определённого периода времени.
Выполните команду uptime:
uptime
Вы увидите вывод, похожий на этот:
HH:MM:SS up DD min, X users, load average: X.XX, X.XX, X.XX
Давайте разберём вывод:
HH:MM:SS: Текущее время.up DD min: Время работы системы (uptime).X users: Количество пользователей, подключённых в данный момент.load average: X.XX, X.XX, X.XX: Эти три числа представляют среднюю нагрузку системы за последние 1, 5 и 15 минут соответственно.
Средняя нагрузка 1.00 на одноядерном процессоре означает, что процессор полностью загружен. На многоядерном процессоре средняя нагрузка, равная количеству ядер процессора, означает, что система полностью загружена. Например, на 4-ядерном процессоре средняя нагрузка 4.00 указывает на полную загрузку. Если средняя нагрузка постоянно превышает количество ядер процессора, это говорит о том, что ваша система перегружена, и процессы ожидают времени выполнения на процессоре.
Определение ядер процессора с помощью lscpu
Для правильной интерпретации средней нагрузки вам необходимо знать, сколько логических ядер процессора имеет ваша система. Команда lscpu предоставляет подробную информацию об архитектуре процессора.
Выполните команду lscpu:
lscpu
Вы увидите подробный вывод. Обратите внимание на строку CPU(s):, которая указывает общее количество доступных логических процессоров. Также Core(s) per socket: и Socket(s): помогут вам понять физическую компоновку.
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
...output omitted...
В приведённом примере CPU(s): 4 указывает, что в этой системе 4 логических ядра процессора.
Интерпретация средней нагрузки и ядер процессора
Давайте объединим информацию из uptime и lscpu. Предположим, что вывод uptime показывает среднюю нагрузку 2.92, 4.48, 5.20, а lscpu показывает CPU(s): 4.
Чтобы получить среднюю нагрузку на процессор, разделите каждое значение средней нагрузки на общее количество логических процессоров:
- За последние 1 минуту:
2.92 / 4 = 0.73 - За последние 5 минут:
4.48 / 4 = 1.12 - За последние 15 минут:
5.20 / 4 = 1.30
Основываясь на этих расчётах:
- За последние 1 минуту процессоры использовались примерно на 73% своей мощности.
- За последние 5 минут система была перегружена примерно на 12% (
1.12 - 1.00 = 0.12). Это означает, что процессы ожидали времени выполнения на процессоре. - За последние 15 минут система была перегружена примерно на 30% (
1.30 - 1.00 = 0.30).
Этот анализ показывает, что система испытывала значительную нагрузку в течение последних 5 и 15 минут, но нагрузка снизилась за последнюю минуту. Такой анализ тенденций имеет решающее значение для понимания состояния системы.
Эти две команды, uptime и lscpu, являются простыми, но мощными инструментами для быстрого определения общего состояния и производительности вашей системы Linux.
Анализ активности процессов с помощью top
В этом шаге вы углубитесь в использование команды top для анализа активности процессов. Хотя top предоставляет обзор в реальном времени, она также предлагает мощные интерактивные возможности для сортировки, фильтрации и управления процессами.
Вспомните из предыдущего шага, что top предоставляет динамический вид вашей системы. Давайте снова запустим top:
top
Вы увидите знакомый интерфейс top. Верхняя часть предоставляет системную статистику, а нижняя часть отображает список процессов.
Понимание столбцов в top
Давайте рассмотрим стандартные столбцы в списке процессов:
- PID: Идентификатор процесса.
- USER: Владелец процесса.
- PR: Приоритет процесса.
- NI: Значение nice (меньшее значение nice означает более высокий приоритет).
- VIRT: Виртуальная память, используемая процессом.
- RES: Резидентная память (физическая оперативная память), используемая процессом.
- SHR: Общая память, используемая процессом.
- S: Состояние процесса (R=Запущен, S=Ожидание, D=Непрерываемое ожидание, T=Остановлен, Z=Зомби).
- %CPU: Процент использования процессора с момента последнего обновления.
- %MEM: Процент использования памяти (RES / общая физическая память).
- TIME+: Общее время использования процессора процессом с момента его запуска.
- COMMAND: Имя команды, которая запустила процесс.
Интерактивные клавиши в top
top — это высокоинтерактивная команда. Вы можете нажимать различные клавиши, чтобы изменить отображение и взаимодействовать с процессами.
Сортировка процессов:
- Нажмите
Shift+P(заглавная P), чтобы отсортировать процессы по использованию процессора (%CPU), что часто является значением по умолчанию. - Нажмите
Shift+M(заглавная M), чтобы отсортировать процессы по использованию памяти (%MEM). - Нажмите
Shift+T(заглавная T), чтобы отсортировать процессы поTIME+.
Попробуйте нажать
Shift+Mсейчас, чтобы отсортировать по использованию памяти. Обратите внимание, как список процессов переупорядочивается. Затем нажмитеShift+P, чтобы вернуться к сортировке по использованию процессора.- Нажмите
Фильтрация по пользователю:
- Нажмите
u(строчная u).topзапросит имя пользователя. Введитеlabexи нажмите Enter. - Теперь
topбудет отображать только процессы, принадлежащие пользователюlabex. Это очень полезно для фокусировки на собственных процессах. - Чтобы очистить фильтр и показать всех пользователей снова, нажмите
u, а затем нажмите Enter, не вводя имя пользователя.
- Нажмите
Изменение интервала обновления:
- По умолчанию
topобновляется каждые 3 секунды. Вы можете изменить этот интервал. - Нажмите
s(строчная s).topзапросит время задержки. Введите1(для 1 секунды) и нажмите Enter. - Обратите внимание, как отображение обновляется чаще.
- Вы можете изменить его обратно на 3 секунды, нажав
sснова и введя3.
- По умолчанию
Завершение процесса:
- Вы можете завершить процесс непосредственно из
top. - Сначала запустим процесс
sleepв фоновом режиме в новой вкладке или окне терминала, или нажавCtrl+Zв текущем терминале, затемbg, чтобы поместитьtopв фоновый режим, затем запуститеsleep 600 &, затемfg, чтобы вернутьtopв фоновый режим. - В качестве альтернативы, вы можете открыть новую вкладку терминала (например,
Ctrl+Shift+Tво многих терминалах) и запуститьsleep 600 &там. - После запуска процесса
sleepвернитесь к терминалуtop. - Нажмите
k(строчная k).topзапросит PID процесса для завершения. - Найдите PID вашего процесса
sleep 600в спискеtop. Введите этот PID и нажмите Enter. topзапросит сигнал для отправки. По умолчанию это15(SIGTERM). Нажмите Enter, чтобы отправитьSIGTERM.- Процесс
sleepдолжен исчезнуть из списка. Если нет, вы можете попробоватьkснова и отправить сигнал9(SIGKILL).
- Вы можете завершить процесс непосредственно из
Изменение приоритета процесса (renicing):
- Изменение приоритета процесса. Меньшее значение nice означает более высокий приоритет.
- Нажмите
r(строчная r).topзапросит PID, а затем значение nice (например,-10для более высокого приоритета,10для более низкого приоритета). - Это расширенная функция для управления системными ресурсами. Для этой лабораторной работы просто нажмите
r, затем дваждыEnter, чтобы отменить операцию без каких-либо изменений.
Выход из
top:- Когда вы закончите, нажмите
q(строчная q), чтобы выйти изtopи вернуться к приглашению вашего терминала.
- Когда вы закончите, нажмите
top — незаменимый инструмент для системных администраторов и пользователей. Овладение его интерактивными функциями позволяет быстро и эффективно диагностировать проблемы производительности системы и управлять процессами.
Резюме
В этой лабораторной работе вы изучили основные концепции управления процессами в Linux. Вы начали с понимания состояний процессов и их жизненного цикла, используя команды ps и top, наблюдая, как процессы переходят между состояниями, такими как Запущен (R), Прерывимое ожидание (S) и Остановлен (T). Вы практиковались в определении распространённых состояний процессов и интерпретации вывода команд ps aux и ps -ef, чтобы получить представление о системных процессах.
Кроме того, вы изучили методы управления фоновыми и фоновыми задачами, что имеет решающее значение для эффективного использования терминала. Вы также освоили завершение процессов с помощью различных команд, таких как kill, killall и pkill, понимая их различные применения для плавного или принудительного завершения. Наконец, вы научились отслеживать нагрузку системы и использование процессора с помощью uptime и lscpu, а также анализировать подробную активность процессов с помощью top, обеспечивая комплексный обзор производительности системы и использования ресурсов.



