Управление процессами

Получение информации о процессе

Перед тем как управлять процессами, нужно научиться получать о процессах необходимую информацию. В ОС существует псевдофайловая система procfs, которая в большинстве дистрибутивов монтируется в общую ФС в каталог /proc. У данной ФС нет физического места размещения, нет блочного устройства, такого как жесткий диск. Вся информация, хранимая в данном каталоге, находится в оперативной памяти компьютера, контролируется ядром ОС и не предназначена для хранения файлов пользователя.

Для получения информации о каком-либо процессе можно использовать существующие утилиты 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 – по времени выполнения.

С помощью команды <K> можно завершить некоторый процесс (его PID будет запрошен), а с помощью команды <R> можно переопределить значение nice для некоторого процесса.

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

Приоритезация

Каждому процессу при запуске устанавливается определенный приоритет, который имеет значение от -20 до +20, где +20 самый низкий. Приоритет нового процесса равен приоритету процесса-родителя. Для изменения приоритета запускаемой программы существует утилита nice. Пример ее использования:

nice [- adnice] command [args]

где adnice – значение (от –20 до +19), добавляемое к значению nice процесса-родителя. Отрицательные значения может устанавливать только суперпользователь. Если опция adnice не задана, то по умолчанию для процесса-потомка устанавливается значение nice, увеличенное на 10 по сравнению со значением nice родительского процесса.

Команда renice служит для изменения значения nice для уже выполняющихся процессов. Суперпользователь может изменить приоритет любого процесса в Системе. Другие пользователи могут изменять значение приоритета только для тех процессов, для которых данный пользователь является владельцем. При этом обычный пользователь может только уменьшить значение приоритета. Поэтому процессы с низким приоритетом не могут породить "высокоприоритетных детей".

Одним из средств управления процессами являются сигналы. Некоторые сигналы можно сгенерировать с помощью определенных комбинаций клавиш, но такие комбинации существуют не для всех сигналов. Зато имеется команда kill, которая позволяет послать заданному процессу (указав его PID) любой сигнал:

kill [-SIG] PID [PID..]

где SIG – это номер сигнала или наименование сигнала, причем если указание сигнала опущено, то посылается сигнал 15 (SIGTERM программное завершение процесса). Часто используется сигнал 9 (KILL), с помощью которого суперпользователь может завершить любой процесс. Но сигнал этот очень "грубый", потому что он просто "убивает" процесс, не давая ему времени на корректное сохранение всех обработанных данных. Поэтому в большинстве случаев рекомендуется использовать сигналы TERM или QUIT, которые завершают процесс более "мягко". Если процессу необходимо как-то по-особенному реагировать на сигнал, он может зарегистрировать обработчик, а если обработчика нет, за него отреагирует Система.

Два сигнала 9(KILL) и 19(stop) всегда обрабатывает Система. Первый из них нужен для того, чтобы убить процесс наверняка (отсюда и название). Сигнал stop приостанавливает процесс: в таком состоянии процесс не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не получит сигнал 18 ( CONT) после чего продолжит работу. В ОС сигнал stop можно передать активному процессу с помощью управляющего символа "^Z".

Обычные пользователи могут посылать сигналы только тем процессам, для которых они являются владельцами. Если в команде kill воспользоваться идентификатором процесса (PID), равным -1, то указанный в команде сигнал будет послан всем принадлежащим данному пользователю процессам. Суперпользователь root может посылать сигналы любым процессам. Когда суперпользователь посылает сигнал идентификатору -1, он рассылается всем процессам, за исключением системных. Если этим сигналом будет SIGKILL, то у простых пользователей будут потеряны все открытые ими, но не сохраненные файлы данных.

При обычном запуске процесс работает на переднем плане, то есть процесс "привязывается" к терминалу, с которого он запущен, воспринимая ввод с этого терминала и осуществляя на него вывод. Но можно запустить процесс в фоновом режиме, когда он не связан с терминалом, для чего в конце командной строки запуска программы добавляют символ "&".

Есть также две встроенные команды, которые служат для перевода процессов на передний план или возврата их в фоновый режим. Команда fg переводит указанный в аргументе процесс на передний план, а команда bg переводит процесс в фоновый режим. Одной командой bg можно перевести в фоновый режим сразу несколько процессов, а вот возвращать их на передний план необходимо по одному. Аргументами команд fg и bg могут являться только номера заданий, запущенных из текущего экземпляра shell. Возможные значения заданий можно увидеть, выполнив команду jobs.

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

nohup команда &

Запущенный таким образом процесс будет игнорировать посылаемые ему сигналы (не игнорируются только сигналы SIGHUP и SIGQUIT).

Команда free

В ОС можно использовать команду free чтобы получить подробный отчет об использовании памяти Системой.

Команда 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 КiB = 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), за которым следует число, определяющее задержку.

Например, чтобы распечатывать информацию о памяти каждые пять секунд, необходимо выполнить (Рисунок 12):

free -s 5

Рисунок 12 - Вывод команды free -s 5

Команда free будет продолжать отображать результат, пока не буде нажата комбинация клавиш Ctrl+C, что похоже на поведение команды watch.

Чтобы отображать результат определенное количество раз, используют параметр -c(--count). Например, эта команда выведет результат десять раз (Рисунок 13):

free -s 5 -c 3

Рисунок 13 - Вывод команды free -s 5 -c 3

Команду в реальной работе следует автоматизировать и запускать непрерывно или периодически

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

  • параметр -s, который запускает команду free в течение заданного интервала секунд, пока пользователь не закроет программу (Ctrl+C);
  • параметр -c, который можно использовать отдельно или в сочетании с параметром секунд. Если ввести только -c и целое число (n), команда будет запускаться n раз. По умолчанию используются интервалы в одну секунду.

Например, если требуется открыть несколько приложений и посмотреть количество используемой памяти. Для тестового вывода используется читаемый человеком формат: степени 1000 (Gb) вместо 1024 (GiB). Запись ведется в течение 20 секунд, чтобы проанализировать воздействие. Данные собираются каждые 5 секунд за 4 цикла. Пример, отформатированный для командной строки и ее вывода (Рисунок 14):

free -h --si -s 5 -c 4

Рисунок 14 - Вывод примера команды free

В результате будет показан только один вывод для команды free, но этот вывод будет изменяться через регулярные промежутки времени (Рисунок 15).

watch free -h

Рисунок 15 - Вывод команды watch free -h

Команда htop

Команда htop – это интерактивный монитор Системы в терминале, который предоставляет детальную информацию о загрузке процессора, использовании памяти, активности сети и других ресурсах. Вот несколько ключевых функций и использований htop:

  • Мониторинг процессов отображает список текущих процессов в Системе, а также информацию о CPU, памяти и других ресурсах, используемых каждым процессом; процессы отображаются в виде древовидной структуры, позволяя легко увидеть зависимости между процессами;
  • Интерактивный интерфейс позволяет пользователю в реальном времени взаимодействовать с данными; можно использовать клавиши со стрелками и функциональные клавиши для сортировки, фильтрации и управления процессами;
  • Мониторинг ресурсов показывает использование процессора, памяти (включая использование swap), сети и дисков; графики в верхней части экрана предоставляют визуальное представление общей загрузки CPU и использования памяти;
  • Управление процессами позволяет завершать, приостанавливать, возобновлять и изменять приоритеты процессов напрямую из интерфейса htop; пользователь может отправлять сигналы процессам, например для перезапуска или завершения процесса;
  • Поддержка цветов использует цвета для облегчения восприятия информации, что делает отображение данных более интуитивным;
  • Поиск и фильтрация пользователь может использовать встроенные инструменты для поиска и фильтрации процессов по различным критериям.

Команду htop можно запускать как с правами обычного пользователя (Рисунок 16):

htop

так и с привилегиями суперпользователя:

sudo htop

Рисунок 16 - Вывод команды htop

Чтобы программа выводила новые данные раз в 5 секунд:

sudo htop -d 50

Для вывода процессов в виде дерева используют опцию -t (Рисунок 17):

sudo htop -t

Рисунок 17 - Вывод команды htop -t

Команда df

Чтобы посмотреть доступное пространство на всех примонтированных разделах и информацию о них достаточно набрать команду (Рисунок 18):

df

Рисунок 18 - Вывод команды df

Утилита отображает стандартный набор колонок, но понять в ее выводе что-то с первого раза сложно. Все данные выводятся в килобайтах. Теперь можно попросить утилиту выводить данные в более читаемом формате (Рисунок 19):

df -h

Рисунок 19 - Вывод команды df -h

Это самое популярное сочетание опций, потому что оно дает максимально понятную информацию и уже можно судить о том, что происходит на диске. Например, можно увидеть в корневой директории уже занято 83% места и, возможно, пора что-то удалить. Если задать опцию -a, можно получить информацию обо всех файловых системах известных ядру, которые были смонтированы (Рисунок 20):

df -a

Рисунок 20 - Вывод команды df -a

Здесь отображается огромное количество виртуальных ФС ядра. Если требуется вывести только информацию про реальные ФС на жестком диске, можно использовать опцию -x, чтобы отфильтровать все tmpfs:

df -x tmpfs

Также можно отфильтровать две ФС:

df -x devtmpfs -x tmpfs

или же указать ФС, которую нужно отображать:

df -t ext4

Также можно указать интересующий раздел (Рисунок 21):

df -h /dev/sda2

Рисунок 21 - Вывод команды df -h /dev/sda2

С помощью опции -i можно посмотреть информацию про состояние inode в ФС (Рисунок 22):

df -hi /dev/sda2

Рисунок 22 - Вывод команды df -hi /dev/sda2

Вывести объем доступного пространства в каталоге:

df -h /home

Команда df – очень простой в освоении, но эффективный инструмент, позволяющий всегда быть в курсе использования дискового пространства в Системах.

Команда du

Команда 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 – отображает только общий размер указанного каталога, а не подкаталогов (Рисунок 23):
sudo du -sh /var
  • -c – указывает du сообщать общую сумму, если требуется получить объединенный размер двух или более каталогов (Рисунок 24):

Рисунок 23 - Вывод команды du -sh /var

sudo du -csh /var/log /var/lib

Рисунок 24 - Вывод команды du -csh /var/lib /var/log

  • --max-depth – отображает использование диска подкаталогами n-уровня с указанием уровня подкаталогов, например, чтобы получить отчет о каталогах первого уровня, используют (Рисунок 25):
sudo du -h --max-depth=1 /var/log

Рисунок 25 - Вывод команды du -h --max-depth=1 /var/log

  • --apparent-size – по умолчанию утилита du повторно использует дисковое пространство, используемое каталогом или файлом; чтобы узнать очевидный размер файла (фактический объем данных в файле), используют переключатель (Рисунок 26):
sudo du -sh --apparent-size /var/lib

Рисунок 26 - Вывод команды sudo du -sh --apparent-size /var/lib

du также позволяет использовать шаблон оболочки. Например, чтобы получить размер всех каталогов, начинающихся с "rc" в каталоге /etc, нужно выполнить:

sudo du -csh /etc/rc*

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

Команду du можно комбинировать с другими командами с конвейерами.

Например, чтобы напечатать 5 самых больших каталогов внутри каталога /var нужно передать вывод du в команду sort, чтобы отсортировать каталоги по их размеру, а затем передать результат в команду head, которая распечатает только 5 верхних каталогов:

sudo du -h /var/ | sort -rh | head -5

В отличие от команды df, которая выводит информацию об использовании диска смонтированными ФС, команда du дает оценку дискового пространства, используемого данными файлами или каталогами.