Процессы

Алгоритм работы процессов в ОС определяется следующими условиями:

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

Типичный процесс в Linux-подобной ОС может быть представлен схемой (рисунок 82).

Рисунок 82 - Схема жизненного цикла процесса в ОС

Этапы состоят из следующих шагов:

  1. процесс /bin/bash клонирует себя системным вызовом fork();
  2. при этом создается клон /bin/bash с новым PID (идентификатор процесса) и PPID, равный PID родителя;
  3. клон выполняет системный вызов exec с указанием на исполняемый файл и заменяет свой код кодом исполняемого файла (родительский процесс при этом ждет завершения потомка wait();
  4. если по каким-то причинам потомок завершил свою работу, а родительский процесс не смог получить об этом сигнал, то данный процесс (потомок) не освобождает занятые структуры ядра и состояние процесса становиться zombie. Первый процесс в Системе запускается при инициализации ядра. Данный процесс называется init** **и имеет PID=1 – это прародитель всех процессов в Системе. Каждый запущенный процесс может находиться в одном из следующих состояний:
  • R (Running) – активен, выполняется или ожидает выделения процессорного времени;
  • S (Sleeping) – находится в прерываемом ожидании события или освобождения ресурса;
  • D (Uninterruptible sleep) – ожидает сигнал от аппаратной части и не реагирует на другие сигналы;
  • T (Stopped) – приостановлен, обычно в режиме трассировки при отладке;
  • Z (Zombie) – завершён, но его структуры ядра не освобождены. Такое состояние возникает, если родительский процесс не получил сигнал о завершении дочернего;
  • Сироты (Orphan) – процессы, потерявшие родителя. Они автоматически передаются процессу init, который обрабатывает сигналы об их завершении. Процессы-зомби не используют ресурсы, но занимают записи в таблице процессов. Их появление свидетельствует о нарушении работы программ или оборудования и требует проверки состояния Системы. Также, говоря о процессах в ОС, можно выделить особый вид процессов демоны. Данный вид процессов работает в фоне (подобно службам в Windows) без терминала и выполняет задачи для других процессов. Данный вид процессов на серверных системах является основным.

Жизненный цикл процесса

Каждому процессу при запуске назначается приоритет от –20 до +20, где:

  • –20 – наивысший приоритет (процесс получает больше процессорного времени),
  • +20 – низший приоритет. Значение приоритета наследуется от родительского процесса. Для изменения приоритета запускаемой программы используется утилита nice. Пример использования:
    nice [-n adnice] команда [аргументы]
    
    где adnice — числовое значение от –20 до +19, добавляемое к приоритету (значению nice) родительского процесса. Отрицательные значения могут назначаться только суперпользователем. Если параметр adnice не указан, приоритет процесса-потомка автоматически увеличивается на 10 по сравнению со значением родителя. Изменить приоритет уже выполняющегося процесса позволяет команда renice. Обычные пользователи могут понижать приоритет только своих процессов, суперпользователь — любых. Для управления процессами применяются сигналы. Наиболее часто используется команда kill:
    kill [-SIG] PID
    
    где SIG – это номер сигнала или наименование сигнала. Если сигнал не указан, по умолчанию отправляется SIGTERM (15) — корректное завершение процесса. Для принудительного завершения любого процесса пользователем root применяется сигнал SIGKILL (9), приостанавливает выполнение — SIGSTOP (19), возобновляет — SIGCONT (18). Обычные пользователи могут посылать сигналы только тем процессам, для которых они являются владельцами. Суперпользователь root может посылать сигналы любым процессам.

Приоритезация процессов

По умолчанию процессы выполняются на переднем плане. Для запуска в фоновом режиме используется символ "&" в формате:

команда &

Команды 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:
    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
    
    В верхней части вывода отображается астрономическое время, время, прошедшее с момента запуска Системы, число пользователей в Системе, число запущенных процессов и число процессов, находящихся в разных состояниях, данные об использовании ЦПУ, памяти и свопа. Далее следует таблица, характеризующая отдельные процессы. Число строк, отображаемых в этой таблице, определяется размером окна: сколько строк помещается, столько и выводится. Содержимое окна обновляется каждые 5 секунд. Список процессов может быть отсортирован по используемому времени ЦПУ (по умолчанию), по использованию памяти, по PID, по времени исполнения. Переключать режимы сортировки при отображении можно с помощью следующих клавиатурных команд:
  • 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 -h
    
    Команда free также позволяет указать единицы измерения памяти. Допустимые варианты:
  • 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 --mega
    
    Чтобы постоянно отображать информацию о памяти на экране, нужно вызвать free** **с параметром -s(--seconds), за которым следует число, определяющее задержку.

Например, чтобы выдавать информацию о памяти каждые пять секунд, необходимо выполнить (рисунок 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 du -h /var/lib
    
    Следует использовать команду sudo, потому что большинство файлов и каталогов внутри каталога /var/lib принадлежат пользователю root** **и не доступны для чтения обычным пользователям.
  • -s – отображает только общий размер указанного каталога, а не подкаталогов (рисунок 86):
    sudo du -sh /var
    
    Рисунок 86 - Вывод команды du -sh /var
  • -c – указывает команде du** **сообщать общую сумму, если требуется получить объединенный размер двух или более каталогов (рисунок 87):
    sudo du -csh /var/log /var/lib
    
    Рисунок 87 - Вывод команды du -csh /var/lib /var/log
  • --max-depth – отображает использование диска подкаталогами n-уровня с указанием уровня подкаталогов, например, чтобы получить отчет о каталогах первого уровня, используют (рисунок 88):
    sudo du -h --max-depth=1 /var/log
    
    Рисунок 88 - Вывод команды du -h --max-depth=1 /var/log
  • --apparent-size – по умолчанию утилита du повторно использует дисковое пространство, используемое каталогом или файлом; чтобы узнать очевидный размер файла (фактический объем данных в файле), используют переключатель (рисунок 89):
    sudo du -sh --apparent-size /var/lib
    
    Рисунок 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 **дает оценку дискового пространства, используемого данными файлами или каталогами.

Комбинации команд

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