Практика. Просмотр и управление процессами.
Команды
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
- Отобразите список всех процессов, запущенных в системе.
 - Отобразите список всех процессов, запущенных от имени вашего пользователя.
 - Подсчитайте количество процессов, запущенных от имени вашего пользователя.
 - Подсчитайте количество процессов, запущенных от имени пользователя root.
 - Отобразите список всех процессов, указав следующую информацию:
    
- Уникальный идентификатор процесса.
 - Идентификатор родительского процесса.
 - Процент используемого процессорного времени.
 - Процент используемой (резидентной) памяти процесса.
 
 - Узнайте сколько процессорного времени было потрачено процессом 
systemd. - Узнайте как долго работает процесс 
systemd. - Найдите процесс с самой длинной командой запуска.
 
Интерактивный просмотр списка процессов в Linux с помощью top
Документация
Ознакомьтесь с документацией на приложение top:
- Команда TOP в Linux
 - Как пользоваться командой top для наблюдения за процессами в Linux
 - 15 примеров использования в Linux команды top
 - man 1 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для отображения списка горячих клавиш, на которые реагируетtopqдля выхода из приложения
Задачи на использование top
- Изучите ваш компьютер:
    
- Какой объём оперативной памяти доступен в системе?
 - Какой объём раздела подкачки доступен в системе?
 - Какой объём загрузки системы был за последние 5 минут?
 - Какое количество процессоров есть в системе?
 
 - Какой процесс в текущий момент потребляет больше всего процессорного времени?
 - Какой процесс от пользователя root в настоящий момент потребляет больше всего оперативной памяти?
 - Измените список активных столбцов на следующий:
    
- Номер процесса.
 - Номер последнего использованного процессора.
 - Процент использования процессора.
 - Процент использования памяти.
 - Номер контролирующего 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. Это имеет смысл для приложений, выполняющих вычисления, чтобы они продолжили свою работу. Это также разумно для приложений с графическим интерфейсом.
Задачи на фоновые процессы
Запуск фоновых задач.
- Запустите приложение 
more.- Завершите работу данного процесса с помощью сочетания клавиш 
Ctrl+C. - Удостоверьтесь, что вы можете выполнять команды в данном Bash-терминале. Удостоверьтесь, что в системе больше нет процессов 
more. 
 - Завершите работу данного процесса с помощью сочетания клавиш 
 - Запустите приложение 
moreв фоновом режиме.- Какой номер получило фоновая задача?
 - Какой номер процесса был выдан данной задаче?
 - Проверьте с помощью 
psномер процесса дляmore. 
 - Отобразите список активных задач для данного Bash-терминала.
 - Верните задачу №1 на передний план.
 - Завершите процесс 
more. 
Приостановка процессов
- Запустите приложение 
more. - Приостановите работу приложения 
moreс помощью сочетания клавишCtrl+Z. Что произошло? - Отобразите список задач для данного Bash-терминала. В каком состоянии находится текущая задача?
 - С помощью приложения 
psнайдите состояние процессаmore. - Продолжите работу приложения в фоновом режиме.
 - Завершите работу текущего 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.
Задачи, требуют графического интерфейса
Если его нет, задачи можно не выполнять
- Запустите в фоновом режиме приложение 
xlogo. - Отправьте процессу 
xlogoсигналHUPс помощью приложенияkill.- Что произошло с процессом 
xlogo? - Что произошло с Bash-терминалом?
 
 - Что произошло с процессом 
 - Запустите в фоновом режиме приложение 
xlogo. - Отправьте процессу 
xlogoсигналINTс помощью приложенияkill.- Что произошло с процессом 
xlogo? - Что произошло с Bash-терминалом?
 
 - Что произошло с процессом 
 - Запустите в фоновом режиме приложение 
xlogo. - Отправьте процессу 
xlogoсигналSIGINTс помощью приложенияkill.- Что произошло с процессом 
xlogo? - Что произошло с Bash-терминалом?
 
 - Что произошло с процессом 
 
Задачu на использование приложения killall
- Запустите в фоновом режиме приложение 
xlogo. - Запустите в фоновом режиме приложение 
xlogo. - Запустите в фоновом режиме приложение 
xlogo. - Остановите все приложения с помощью приложения 
killall.- Что произошло с процессом 
xlogo? - Что произошло с Bash-терминалом?
 
 - Что произошло с процессом