Процессы
Алгоритм работы процессов в ОС определяется следующими условиями:
- имеется запущенный процесс;
- каждый процесс может запускать подпроцессы;
- создание нового процесса создается клонированием исходного;
- прародителем всех процессов в системе является процесс init, запускаемый ядром ОС при загрузке;
- процессы взаимодействуют между собой посредством межпроцессного взаимодействия:
- каналы;
- сигналы;
- сокеты;
- разделяемая память;
- каждый процесс обладает свойствами (процесс обладает контекстом):
- PID – идентификатор процесса;
- PPID – идентификатор процесса, породившего данный процесс;
- UID и GID – идентификаторы прав процесса (соответствует UID и GID пользователя, от имени которого запущен процесс);
- приоритет процесса;
- состояние процесса (выполнение, сон и т.п.).
Типичный процесс в Linux-подобной ОС может быть представлен схемой (рисунок 82).

Рисунок 82 - Схема жизненного цикла процесса в ОС
Этапы состоят из следующих шагов:
- процесс /bin/bash клонирует себя системным вызовом fork();
- при этом создается клон /bin/bash с новым PID (идентификатор процесса) и PPID, равный PID родителя;
- клон выполняет системный вызов exec с указанием на исполняемый файл и заменяет свой код кодом исполняемого файла (родительский процесс при этом ждет завершения потомка wait();
- если по каким-то причинам потомок завершил свою работу, а родительский процесс не смог получить об этом сигнал, то данный процесс (потомок) не освобождает занятые структуры ядра и состояние процесса становиться zombie. Первый процесс в Системе запускается при инициализации ядра. Данный процесс называется init** **и имеет PID=1 – это прародитель всех процессов в Системе. Каждый запущенный процесс может находиться в одном из следующих состояний:
- R (Running) – активен, выполняется или ожидает выделения процессорного времени;
- S (Sleeping) – находится в прерываемом ожидании события или освобождения ресурса;
- D (Uninterruptible sleep) – ожидает сигнал от аппаратной части и не реагирует на другие сигналы;
- T (Stopped) – приостановлен, обычно в режиме трассировки при отладке;
- Z (Zombie) – завершён, но его структуры ядра не освобождены. Такое состояние возникает, если родительский процесс не получил сигнал о завершении дочернего;
- Сироты (Orphan) – процессы, потерявшие родителя. Они автоматически передаются процессу init, который обрабатывает сигналы об их завершении. Процессы-зомби не используют ресурсы, но занимают записи в таблице процессов. Их появление свидетельствует о нарушении работы программ или оборудования и требует проверки состояния Системы. Также, говоря о процессах в ОС, можно выделить особый вид процессов демоны. Данный вид процессов работает в фоне (подобно службам в Windows) без терминала и выполняет задачи для других процессов. Данный вид процессов на серверных системах является основным.
Жизненный цикл процесса
Каждому процессу при запуске назначается приоритет от –20 до +20, где:
- –20 – наивысший приоритет (процесс получает больше процессорного времени),
- +20 – низший приоритет.
Значение приоритета наследуется от родительского процесса.
Для изменения приоритета запускаемой программы используется утилита nice. Пример использования:
где adnice — числовое значение от –20 до +19, добавляемое к приоритету (значению nice) родительского процесса. Отрицательные значения могут назначаться только суперпользователем. Если параметр adnice не указан, приоритет процесса-потомка автоматически увеличивается на 10 по сравнению со значением родителя. Изменить приоритет уже выполняющегося процесса позволяет команда renice. Обычные пользователи могут понижать приоритет только своих процессов, суперпользователь — любых. Для управления процессами применяются сигналы. Наиболее часто используется команда kill:
nice [-n adnice] команда [аргументы]где SIG – это номер сигнала или наименование сигнала. Если сигнал не указан, по умолчанию отправляется SIGTERM (15) — корректное завершение процесса. Для принудительного завершения любого процесса пользователем root применяется сигнал SIGKILL (9), приостанавливает выполнение — SIGSTOP (19), возобновляет — SIGCONT (18). Обычные пользователи могут посылать сигналы только тем процессам, для которых они являются владельцами. Суперпользователь root может посылать сигналы любым процессам.kill [-SIG] PID
Приоритезация процессов
По умолчанию процессы выполняются на переднем плане. Для запуска в фоновом режиме используется символ "&" в формате:
команда &
Команды fg и bg переводят процессы между передним и фоновым режимом соответственно. Список активных заданий отображается командой jobs.
Чтобы процесс продолжал выполняться после выхода из оболочки, применяется утилита nohup:
nohup команда &
Запущенный таким образом процесс будет игнорировать посылаемые ему сигналы (не игнорируются только сигналы SIGHUP и SIGQUIT).
Работа в фоновом и переднем режиме
Для получения информации о каком-либо процессе можно использовать существующие утилиты ps и top для просмотра информации о процессах.
Чтобы получить список всех процессов, достаточно ввести команду:
ps aux
Следует обратить внимание, что некоторые процессы указаны в квадратных скобках "" – это процессы, которые входят непосредственно в состав ядра и выполняют важные системные задачи, например, такие как управление буферным кешем pdflush и организацией свопинга kswapd, которые требуют очень ответственное отношение. Остальная часть процессов относится к пользовательским.
Информация, получаемая по каждому процессу:
- PID, PPID – идентификатор процесса и его родителя;
- %CPU – доля процессорного времени, выделенная процессу;
- %MEM – процент используемой оперативной памяти;
- VSZ – виртуальный размер процесса;
- TTY – управляющий терминал;
- STAT – статус процесса:
- R – выполняется;
- S – "спит";
- Z – "зомби";
- < – повышенный приоритет;
- – в интерактивном режиме;
- START – время запуска;
- TIME – время исполнения на процессоре.
Команда ps делает моментальный снимок процессов в текущий момент. В отличие от нее команда top** **динамически выводит состояние процессов и их активность в реальном режиме времени.
Пример вывода команды top:
В верхней части вывода отображается астрономическое время, время, прошедшее с момента запуска Системы, число пользователей в Системе, число запущенных процессов и число процессов, находящихся в разных состояниях, данные об использовании ЦПУ, памяти и свопа. Далее следует таблица, характеризующая отдельные процессы. Число строк, отображаемых в этой таблице, определяется размером окна: сколько строк помещается, столько и выводится. Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по используемому времени ЦПУ (по умолчанию), по использованию памяти, по PID, по времени исполнения. Переключать режимы сортировки при отображении можно с помощью следующих клавиатурных команд:
14:32:49 up 35 days, 6:01, 4 users, load average: 0.65, 0.51, 0.49 Tasks: 432 total, 1 running, 431 sleeping, 0 stopped, 0 zombie CPU0 : 1.6%us, 3.6%sy, 0.0%ni, 85.3%id, 9.2%wa, 0.0%hi, 0.3%si, 0.0%st CPU1 : 0.9%us, 1.9%sy, 0.0%ni, 96.9%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Mem: 1033596K total, 1016644K used, 16952K free, 82928K buffers Swap: 2096376K total, 12632K used, 2083744K free, 478220K cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2788 root 15 -5 0 0 0 S 2.0 0.0 404:43.97 md3_raid1 7961 root 20 0 5964 2528 1684 R 2.0 0.2 0:00.14 top 6629 root 20 0 8612 2884 2096 S 0.7 0.3 0:00.96 dovecot-auth 57 root 15 -5 0 0 0 S 0.3 0.0 4:36.10 kblockd/0 8703 ulogd 20 0 17700 4216 656 S 0.3 0.4 87:23.98 ulogd 11336 ldap 20 0 394M 15M 8292 S 0.3 1.5 5:29.28 slapd 25757 ldap 20 0 394M 15M 8292 S 0.3 1.5 5:11.71 slapd 10991 root 20 0 2188 1004 588 S 0.3 0.1 4:23.33 dovecot 1 root 20 0 1712 516 464 S 0.0 0.0 0:46.17 init 2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT -5 0 0 0 S 0.0 0.0 0:05.92 migration/0 ..... 2960 root 16 -4 1980 520 392 S 0.0 0.1 0:10.04 udevd 2993 dovecot 20 0 4412 1800 1476 S 0.0 0.2 0:00.00 pop3-login 2994 dovecot 20 0 4412 1800 1476 S 0.0 0.2 0:00.02 pop3-login - Shift+N – по PID;
- Shift+A – по возрасту;
- Shift+P – по использованию ЦПУ;
- Shift+M – по использованию памяти;
- Shift+T – по времени выполнения.
С помощью команды
можно завершить некоторый процесс (его PID будет запрошен), а с помощью команды можно переопределить значение nice** **для некоторого процесса. Полезную информацию о процессах также позволяет получить программа lsof, которая выдает список всех файлов, используемых сейчас процессами, включая каталоги, используемые каким-либо процессом в качестве текущего или корневого; разделяемые библиотеки, загруженные в память и т. д.
Получение информации о процессе
Управление процессами
Команда free используется для получения** **подробного отчета об использовании памяти Системой, предоставляет информацию об общем объеме физической памяти и памяти подкачки, а также о свободной и используемой памяти.
Синтаксис команды следующий:
free [OPTIONS]
При использовании без какой-либо опции команда free** **будет отображать информацию о памяти и подкачке в килобайтах.
Обозначения столбцов при выводе команды:
- total** **– общий объем памяти, который может быть использован приложениями.
- used** **– используемая память, которая рассчитывается как: used = total-free-buffers- cache.
- free – свободная/неиспользуемая память.
- Shared** **– можно игнорировать, поскольку не имеет значения (только для обратной совместимости);
- buff / cache – объединенная память, используемая буферами ядра, а также страничным кешем и блоками. Эта память может быть освобождена в любое время, если это необходимо приложениям.
- available – оценка объема памяти, доступного для запуска новых приложений без подкачки.
Если требуется, чтобы буферы и кеш отображались в двух отдельных столбцах, используют параметр** -w.
По умолчанию команда free показывает информацию о памяти в килобайтах. Чтобы просмотреть информацию в удобочитаемом формате (обычно в мегабайтах и гигабайтах), используют параметр -h:**
Команда free также позволяет указать единицы измерения памяти. Допустимые варианты:
free -h - b, --bytes – отображать вывод в байтах;
-kilo – отображать вывод в килобайтах (1 Кб = 1000 байт);-mega – отображать вывод в мегабайтах;-giga – показать вывод в гигабайтах;-tera – показать вывод в терабайтах;- k, --kibi – показать вывод в кибибайтах. (1 Киб = 1024 байт) (по умолчанию);
- m, --mebi
– показать вывод в мебибайтах (1 МиБ = 2^20 байт); - g, --gibi – показать вывод в гибибайтах (1 ГиБ=2^30 байт);
- -tebi – отображать вывод в тебибайтах (1 ТиБ = 2^40 байт);
- -peti – показать вывод в пебибайтах (1 ПиБ = 2^50 байт);
- -si – вместо 1024 используют --mebi --si 1000. Например, --mebi --si равно --mega.
Например, чтобы отобразить результат в мегабайтах, следует выполнить:
Чтобы постоянно отображать информацию о памяти на экране, нужно вызвать free** **с параметром -s(--seconds), за которым следует число, определяющее задержку.
free --mega
Например, чтобы выдавать информацию о памяти каждые пять секунд, необходимо выполнить (рисунок 83):
free -s 5

Рисунок 83 - Вывод команды free -s 5
Команда free будет продолжать отображать результат, пока не будет нажата комбинация клавиш Ctrl+C, что похоже на поведение команды watch.
Чтобы отображать результат определенное количество раз, используют параметр -c(--count) и целое число. Например:
free -s 5 -c 3
Команда free
Команда htop – это интерактивный монитор Системы в терминале, который предоставляет детальную информацию о загрузке процессора, использовании памяти, активности сети и других ресурсах. Вот несколько ключевых функций и использований htop:
- отображение активных процессов и их иерархии, а также загрузки CPU, памяти, дисков и сети;
- интерактивное управление процессами – изменение приоритета, приостановка, возобновление и завершение;
- визуальный мониторинг ресурсов с помощью цветных графиков и индикаторов;
- сортировка, поиск и фильтрация процессов по различным параметрам.
Команду htop** **можно запускать с правами обычного пользователя (рисунок 84):
htop
Также команду htop** **можно запускать и с привилегиями суперпользователя:
sudo htop

Рисунок 84 - Вывод команды htop
Основные параметры запуска htop:
- htop -u <имя_пользователя> – отображение только процессов указанного пользователя;
- htop -p <PID1,PID2,…> – показ только выбранных процессов по их PID;
- htop -s <поле> – сортировка списка по заданному полю (например, CPU%, MEM%, PID);
- htop -d <время> – установка интервала обновления экрана (в десятых долях секунды);
- htop -t – отображение процессов в виде дерева (Tree view);
- htop -C – отключение цветового оформления;
- htop -v – вывод информации о версии утилиты. Горячие клавиши в интерактивном режиме:
- F2 – настройки интерфейса;
- F3 – поиск процесса;
- F4 – фильтрация списка процессов;
- F5 – переключение в древовидный режим;
- F6 – выбор поля сортировки;
- F9 – завершение выбранного процесса;
- F10 – выход из программы.
Команда htop
Команда df (disk free) используется для отображения информации о файловых системах, подключённых к Системе, включая их общий объём, использованное и свободное пространство, а также точки монтирования.
Базовый вызов команды (рисунок 85):
sudo df

Рисунок 85 - Вывод команды df
Наиболее используемые опции команды:
- -h – вывод в удобном для чтения формате (K, M, G);
- -H – аналогично -h, но с использованием степеней 1000, а не 1024;
- -T – отображение типа файловой системы;
- -i – отображение информации об inode (вместо байтов);
- -t <тип> – показать только файловые системы указанного типа (например, ext4, tmpfs);
- -x <тип> – исключить файловые системы заданного типа;
- --total – добавление строки с общим суммарным объёмом всех разделов;
- -a – вывод всех файловых систем, включая псевдо-файловые и те, где размер равен нулю;
- -P – использование стандартного формата POSIX (удобно при парсинге вывода скриптами);
- -hT – оценка загрузки дисков и поиск переполненных разделов;
- -h /имя каталога – вывод объема доступного пространства в каталоге.
Команда df
Команда du сообщает приблизительный объем дискового пространства, используемого данными файлами или каталогами. Это практически полезно для поиска файлов и каталогов, занимающих большие объемы дискового пространства.
Общий вид команды:
du [OPTIONS]... FILE...
Если данный FILE является каталогом, команда du** **будет суммировать использование диска для каждого файла и подкаталога в этом каталоге. Если FILE не указан, du сообщит об использовании диска в текущем рабочем каталоге.
При выполнении без какой-либо опции du отображает использование диска для данного файла или каталога и каждого из его подкаталогов в байтах.
Также можно передать команде du несколько файлов и каталогов в качестве аргументов:
du ~/Documents ~/Pictures
Если запустить du для файла или каталога, для которого нет прав, в выводе получится примерно следующее "du: невозможно прочитать каталог". В этой ситуации нужно будет добавить к команде sudo.
Часто используемые параметры для команды** **du:
- -a – сообщает об использовании дискового пространства каждым файлом в каталоге:
du -a /tmp/ - -h – отображает информацию о пространстве, занимаемом только данным каталогом, в удобочитаемом формате, например, чтобы получить общий размер /var/lib и всех его подкаталогов, нужно выполнить следующую команду:
Следует использовать команду sudo, потому что большинство файлов и каталогов внутри каталога /var/lib принадлежат пользователю root** **и не доступны для чтения обычным пользователям.
sudo du -h /var/lib - -s – отображает только общий размер указанного каталога, а не подкаталогов (рисунок 86):
sudo du -sh /var
- -c – указывает команде du** **сообщать общую сумму, если требуется получить объединенный размер двух или более каталогов (рисунок 87):
sudo du -csh /var/log /var/lib
- --max-depth – отображает использование диска подкаталогами n-уровня с указанием уровня подкаталогов, например, чтобы получить отчет о каталогах первого уровня, используют (рисунок 88):
sudo du -h --max-depth=1 /var/log
- --apparent-size – по умолчанию утилита du повторно использует дисковое пространство, используемое каталогом или файлом; чтобы узнать очевидный размер файла (фактический объем данных в файле), используют переключатель (рисунок 89):
sudo du -sh --apparent-size /var/lib
du** **также позволяет использовать шаблон оболочки. Например, чтобы получить размер всех каталогов из /etc, начинающихся с "rc", нужно выполнить:
sudo du -csh /etc/rc*
Команда du
Команду du** **можно комбинировать с другими командами с конвейерами.
Например, чтобы напечатать 5 самых больших каталогов внутри каталога /var нужно передать вывод du в команду sort**, чтобы отсортировать каталоги по их размеру, а затем передать результат в команду head, **которая распечатает только 5 верхних каталогов:
sudo du -h /var/ | sort -rh | head -5
В отличие от команды df**, которая выводит информацию об использовании диска смонтированными ФС, команда du **дает оценку дискового пространства, используемого данными файлами или каталогами.
Комбинации команд
Довольно часто приходится сталкиваться с тем, что программное обеспечение не работает должным образом. В разделе приведены наиболее простые инструменты и способы поиска ошибок в программах.