Просмотр и управление процессами #
Команды #
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
для отображения списка горячих клавиш, на которые реагируетtop
q
для выхода из приложения
Задачи на использование 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-терминалом?
- Что произошло с процессом