Просмотр и управление процессами

Просмотр и управление процессами #

Команды #

  • ps - отобразить список процессов в текущий момент времени.
  • top - интерактивное отображение процессов.
  • jobs - отобразить задачи текущего Bash-процесса.
  • bg - переместить задачу в фоновый режим работы.
  • fg - переместить задачу на передний план.
  • kill - послать сигнал процессу.
  • killall - послать сигнал процессам по имени.
  • shutdown - отключить или перезагрузить компьютер.

Процессы в Linux #

Документация #

Процессы и зачем о них знать #

Понятие процесса является краеугольным в теории и практике работы операционных систем. Оно описывает работающее приложение, работающее под управлением операционной системы, выделенные ему ресурсы в определённый момент исполнения.

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

Если процессов запущено слишком много, тогда возможны следующие ситуации:

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

Для решения этих проблем обычно необходимо найти процессы, которые съедают необходимые вычислительные ресурсы. Затем, в зависимости от важности обнаруженного процесса, его можно либо остановить, чтобы освободить ресурсы, либо подождать его завершения перед выполнением новой задачи. И так далее.

Откуда берутся процессы #

Во время загрузки ОС сначала запускается ядро ОС, которое подготавливает оборудование для функционирования и свои внутренние структуры для запуска приложений. Затем ядро запускает init-процесс, который уже ответственен за запуск системных служб. Многие из этих служб продолжают работу в фоновом режиме и выключаются только вместе с завершением операционной системы.

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

В рассмотренной схеме всегда участвуют два процесса: один запускает, а второй запускается. В рамках этого взаимодействия первый называется процессом-родителем, а второй процессом-ребёнком.

Операционная система отслеживает состояние всех процессов. В частности каждому процессу назначается его уникальный идентификатор, process ID, PID. 1 предназначен для процесса init. Другим назначаются свободные номера, зачастую в порядке увеличения номера.

Каждый процесс запускается от имени определённого пользователя и группы. Т.е. каждому процессу присваивается уникальный идентификатор пользователя и группы. В зависимости от этих значений процесс будет иметь соответствующие права по взаимодействию с файловой системой и другими частями ОС.

Просмотр списка процессов в Linux #

Документация #

Ознакомьтесь с документацией на приложение ps:

Краткий обзор приложения ps #

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

Рассмотрим самый простейший вывод ps:

$ ps
    PID TTY          TIME CMD
  30452 pts/1    00:00:00 bash
  32855 pts/1    00:01:07 emacs
  40837 pts/1    00:00:00 ps

В результате вызова ps сформирует таблицу, описывающие процессы, информацию о которых запросил пользователь. По умолчанию выводятся следующие столбцы:

  • PID — уникальный идентификатор процесса.
  • TTY — название терминала, на котором запущена команда.
  • TIME — объём потраченного процессорного времени.
  • CMD — название команды, которая была использована для запуска процесса.

Для получения информации о всех процессах пользователя без привязки к текущему терминалу необходимо передать аргумент x:

$ ps x
    PID TTY      STAT   TIME COMMAND
   1291 ?        Ssl    0:00 /usr/bin/syncthing -no-browser -no-restart -logflags=0
   1512 ?        SNl    2:55 /usr/bin/syncthing -no-browser -no-restart -logflags=0
   4314 ?        Ss     0:00 /lib/systemd/systemd --user
   4315 ?        S      0:00 (sd-pam)
   4339 ?        Ssl    0:00 /usr/bin/pipewire
   4342 ?        SNsl   0:00 /usr/libexec/tracker-miner-fs
   ...

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

Колонка STAT описывает состояние, в котором находится процесс. Рассмотрим ряд состояний:

  • R — работает. Процесс работает или может начать работать.
  • S — спит. Процесс не работает, ожидает появления события. Например нажатия на клавиатуру.
  • D — непрерывный сон. Процесс ожидает окончания операций ввода-вывода.
  • T — остановлен. Процессу дана команду на остановку.
  • Z — сломанный или «зомби» процесс. Процесс был завершён, но информация о нём не была обработана процессом-родителем.
  • < — высоко приоритетный процесс. Данный процесс скорее всего будет выбран следующим для выполнения среди готовых к выполнению в случае выбора очередного процесса для выполнения.
  • N — nice, низкоприоритетный процесс. Этот процесс является вежливым, и будет пропускать другие процессы вперёд в очереди на выполнение.

Задачи на использование приложения ps #

  1. Отобразите список всех процессов, запущенных в системе.
  2. Отобразите список всех процессов, запущенных от имени вашего пользователя.
  3. Подсчитайте количество процессов, запущенных от имени вашего пользователя.
  4. Подсчитайте количество процессов, запущенных от имени пользователя root.
  5. Отобразите список всех процессов, указав следующую информацию:
  • Уникальный идентификатор процесса.
  • Идентификатор родительского процесса.
  • Процент используемого процессорного времени.
  • Процент используемой (резидентной) памяти процесса.
  1. Узнайте сколько процессорного времени было потрачено процессом systemd.
  2. Узнайте как долго работает процесс systemd.
  3. Найдите процесс с самой длинной командой запуска.

Интерактивный просмотр списка процессов в Linux с помощью top #

Документация #

Ознакомьтесь с документацией на приложение top:

Краткий обзор приложения top #

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

Интерфейс top разделён на две части: сверху показывается сводка по загруженности системы, а ниже показывается список процессов. По умолчанию сортировка происходит по уровню загрузки на центральный процессор.

Рассмотрим сводку:

top - 11:54:28 up  3:24,  2 users,  load average: 1,00, 1,40, 1,27
Tasks: 463 total,   1 running, 462 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4,4 us,  0,7 sy,  0,0 ni, 94,5 id,  0,0 wa,  0,0 hi,  0,4 si,  0,0 st
MiB Mem :  32116,7 total,  18212,6 free,   6363,0 used,   7541,1 buff/cache
MiB Swap:  16384,0 total,  16384,0 free,      0,0 used.  24955,0 avail Mem
Строка Поле Значение
1 top Название приложения
1 11:54:28 Текущее время
1 up 3:24 Сколько времени компьютер работает после запуска
1 2 users Количество пользователей в системе
1 load average: Средняя нагрузка на систему, разъяснение ниже
2 Tasks: Сводка процессов и их возможных состояний
3 %Cpu(s): Строка описывает нагрузку на процессор
3 4.4 us 4.4% нагрузки в пространстве пользователя
3 0.7 sy 0.7% нагрузки используется ядром ОС
3 0.0 ni 0.0% используют низкоприоритетные процессы
3 94.5 id 94.5% возможностей процессора не используются
3 0.0 wa 0.0% на задачи, ожидающие окончания ввода/вывода
3 0.0 hi 0.0% на задачи, обрабатывающие прерывания
3 0.4 si 0.4% на обработку программных прерываний
3 0.0 st 0.0% украденного времени внутри виртуальной машины
4 MiB Mem: Информация о занятости оперативной памяти
5 MiB Swap: Информация о занятости раздела подкачки

Приложение top является интерактивным и реагирует на нажатие клавиш. Полезными являются:

  • h для отображения списка горячих клавиш, на которые реагирует top
  • q для выхода из приложения

Задачи на использование top #

  1. Изучите ваш компьютер:
  • Какой объём оперативной памяти доступен в системе?
  • Какой объём раздела подкачки доступен в системе?
  • Какой объём загрузки системы был за последние 5 минут?
  • Какое количество процессоров есть в системе?
  1. Какой процесс в текущий момент потребляет больше всего процессорного времени?
  2. Какой процесс от пользователя root в настоящий момент потребляет больше всего оперативной памяти?
  3. Измените список активных столбцов на следующий:
  • Номер процесса.
  • Номер последнего использованного процессора.
  • Процент использования процессора.
  • Процент использования памяти.
  • Номер контролирующего TTY.

Установите сортировку по проценту использования памяти.

Задачи в Bash, передний план и фоновый режим #

Документация #

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

Краткий обзор состояний процессов #

Подготовка к отправке сообщений #

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

В качестве тестового приложения рассмотрим more с открытым большим текстовым файлом. В качестве файла можно использовать любой большой файл из предыдущих практических. Если у вас нет файла, то можно воспользоваться /var/log/dpkg.log.

Прерывание работы процесса #

Откройте большой текстовый файл с помощью приложения more. Убедитесь, что приложение сейчас работает. На нижней строке терминала должна показываться метка --More--:

2020-10-01 12:07:33 status triggers-pending libc-bin:amd64 2.31-3
--More--(0%)

Нажмите сочетание клавиш Ctrl+c. Работа приложения должна прерваться. Это происходит, т.к. данное сочетание клавиш посылает запрос на завершение работы приложению. При получении этого сигнала приложение обрабатывает его и завершает свою работу.

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

Помещение процесса в фон #

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

Чтобы запустить команду в фоновом режиме необходимо в конце команды поставить знак амперсанда &:

andrey@andrey-home-pc:~$ less /var/log/dpkg.log &
[1] 143700
andrey@andrey-home-pc:~$

В результате выполнения данной команды приложение less было запущено, однако помещено в фон. Напечатанная строка говорит, что сейчас в фоне есть одна задача и PID процесса равен 143700. Если мы посмотрим на запущенные процессы с помощью ps, то увидим:

andrey@andrey-home-pc:~$ ps -o pid,stat,command
    PID STAT COMMAND
 143976 S    bash
 143993 T    less /var/log/dpkg.log
 143994 R+   ps -o pid,stat,command

Обратите внимание на состояние процесса. Мы можем посмотреть список работающих в фоне команд с помощью встроенной команды jobs:

andrey@andrey-home-pc:~$ jobs
[1]+  Остановлен    less /var/log/dpkg.log

Перемещение процесса из фона на передний план #

Фоновые процессы не воспринимают никакой ввод данных от пользователя, включая отправление специальных сигналов (например Ctrl+c). Для возвращения процесса из фона на передний план, например для завершения, необходимо использовать команду fg:

andrey@andrey-home-pc:~$ jobs
[1]+  Остановлен    less /var/log/dpkg.log
andrey@andrey-home-pc:~$ fg %1

Для обозначения работы используется нотация процент-номер задачи.

Приостановка работы процесса #

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

Для помещения текущего процесса из переднего плана в фон необходимо нажать сочетание клавиш Ctrl+z. После этого приложение приостановит свою работу и будет помещено в фон.

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

Задачи на фоновые процессы #

Запуск фоновых задач. #

  1. Запустите приложение more.
    1. Завершите работу данного процесса с помощью сочетания клавиш Ctrl+C.
    2. Удостоверьтесь, что вы можете выполнять команды в данном Bash-терминале. Удостоверьтесь, что в системе больше нет процессов more.
  2. Запустите приложение more в фоновом режиме.
    1. Какой номер получило фоновая задача?
    2. Какой номер процесса был выдан данной задаче?
    3. Проверьте с помощью ps номер процесса для more.
  3. Отобразите список активных задач для данного Bash-терминала.
  4. Верните задачу №1 на передний план.
  5. Завершите процесс more.

Приостановка процессов #

  1. Запустите приложение more.
  2. Приостановите работу приложения more с помощью сочетания клавиш Ctrl+Z. Что произошло?
  3. Отобразите список задач для данного Bash-терминала. В каком состоянии находится текущая задача?
  4. С помощью приложения ps найдите состояние процесса more.
  5. Продолжите работу приложения в фоновом режиме.
  6. Завершите работу текущего Bash-терминала. Что стало с приложением more? Можно ли использовать фоновый процесс, чтобы организовать работу службы?

Сигналы #

Документация #

Краткий обзор сигналов #

Приложение kill #

Приложение kill позволяет «убивать» процессы, в услугах которых мы больше не нуждаемся. Для его использования необходимо знать название процесса или его уникальный идентификатор.

$ kill NUMBER

Данное приложение не «убивает» приложение самостоятельно, а только посылает сигнал ы приложению. Такие же действия происходят, когда мы нажимаем в консоли сочетания клавиш Ctrl+c или Ctrl+z. Только в последнем случае сигналы посылает сам эмулятор терминала, а не выделенное приложение.

Обзор сигналов #

Номер Название Описание
1 HUP Используется рядом служб, чтобы инициировать задачу перезагрузки конфигурации
2 INT Прервать работу, аналогично нажатию Ctrl+c
9 KILL Сигнал обрабатывается не приложением, а ОС. ОС экстренно завершает работу процесса
15 TERM Сигнал по умолчанию, запрос приложению на завершение
18 CONT Продолжить работу после получения сигнала STOP или TSTP
19 STOP Запрос приложению на приостановку деятельности. Обрабатывается ОС
20 TSTP Запрос приложению на приостановку, аналогичен нажатию клавиш Ctrl+z

Для отправки конкретного сигнала приложению необходимо использовать формат kill -1 или kill -HUP.

Задачи, требуют графического интерфейса #

Если его нет, задачи можно не выполнять

  1. Запустите в фоновом режиме приложение xlogo.
  2. Отправьте процессу xlogo сигнал HUP с помощью приложения kill.
    • Что произошло с процессом xlogo?
    • Что произошло с Bash-терминалом?
  3. Запустите в фоновом режиме приложение xlogo.
  4. Отправьте процессу xlogo сигнал INT с помощью приложения kill.
    • Что произошло с процессом xlogo?
    • Что произошло с Bash-терминалом?
  5. Запустите в фоновом режиме приложение xlogo.
  6. Отправьте процессу xlogo сигнал SIGINT с помощью приложения kill.
    • Что произошло с процессом xlogo?
    • Что произошло с Bash-терминалом?

Задачu на использование приложения killall #

  1. Запустите в фоновом режиме приложение xlogo.
  2. Запустите в фоновом режиме приложение xlogo.
  3. Запустите в фоновом режиме приложение xlogo.
  4. Остановите все приложения с помощью приложения killall.
    • Что произошло с процессом xlogo?
    • Что произошло с Bash-терминалом?

© A. M. Васильев, 2022, CC BY-SA 4.0, andrey@crafted.su