Полный цикл в digital

Процессы в Linux, утилита htop

В Linux для каждой отдельной программы, при ее запуске создается процесс. Неважно запускаете программу вы вручную самостоятельно или это делает система или ядро. Например, программа инициализации, которая запускается сразу после завершения загрузки ядра тоже имеет свой процесс с идентификатором 0. Процессы в linux можно описать как контейнеры, в которых хранится вся информация о состоянии и выполнении программы. Если программа работает хорошо, то все нормально, но если она зависла или вам нужно настроить ее работу может понадобиться управление процессами в Linux.

Что такое процесс

Начнем с того, что разберемся в терминах. По сути, процесс — это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа — на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.

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

В Linux есть очень большое количество утилит для решения различных задач по управлению процессами. Давайте установим htop, если она у вас еще не установлена:

sudo apt install htop

Запуск утилиты:

htop

Открыв htop, мы сразу видим список запущенных процессов. Конечно, здесь отображены не все процессы linux:

  • PID идентификатор процесса
  • USER пользователь, от которого был запущен процесс
  • PRI приоритет процесса linux на уровне ядра (обычно NI+20)
  • NI приоритет выполнения процесса от -20 до 19
  • S состояние процесса
  • CPU используемые ресурсы процессора
  • MEM использованная память
  • TIME время работы процесса

К отображению можно добавить и дополнительные параметры. Добавить параметры можно с помощью меню Setup. Там все очень просто, читайте подсказки и следуйте указаниям. Например, добавлен параметр PPID:

Очень важной особенностью программы есть то, что вы можете сортировать процессы в Linux по нужному параметру. Просто кликните по названию параметра, оно выделится зеленым и будет выполнена сортировка. Например, хотите посмотреть в каком порядке запускались процессы, сортируем по PID:

Также есть интересная возможность разместить процессы в виде дерева. Вы сможете увидеть, каким процессом был запущен тот или иной процесс. Для отображения дерева нажмите кнопку F5:

Поиск процессов в Linux

Список процессов, это хорошо. Но иногда, когда какой-нибудь процесс завис и нужно убить процесс Linux или нам нужно провести с ним какие-либо действия, нужно выделить этот процесс из списка, узнать его PID и информацию о нем.

Чтобы найти процесс linux в htop можно использовать кнопку F3. Нажмите F3 и наберите нужное слово. Дальше чтобы перейти к следующему вхождению нажимайте F2 или Esc для завершения поиска:

Для поиска процессов в htop можно использовать также фильтр htop. Нажмите F4, введите слово и будут выведены только процессы linux, имя которых включает это слово:

Быстрый поиск

Часто нужно найти только определенный процесс. Команда pgrep предназначена именно для этого. Она ищет процессы по их имени и возвращает их идентификаторы процессов PID.

Базовый синтаксис команды pgrep выглядит так:

pgrep опции шаблон

По умолчанию утилита ищет по командной строке запуска процесса:

pgrep apache

Если нужно искать только по имени процесса, то надо указать опцию -f:

pgrep -f apache

Для длинного вывода, нужно указать пцию -l:

pgrep -l apache

Изменение приоритета процессов

Приоритет процесса linux означает, насколько больше процессорного времени будет отдано этому процессу по сравнению с другими. Так мы можем очень тонко настроить какая программа будет работать быстрее, а какая медленнее. Значение приоритета может колебаться от 19 (минимальный приоритет) до -20 (максимальный приоритет) процесса linux. Причем, уменьшать приоритет можно с правами обычного пользователя, но чтобы его увеличить нужны права суперпользователя.

В htop для управления приоритетом используется параметр Nice. Напомню, что Priv, это всего лишь поправка, она в большинстве случаев больше за Nice на 20. Чтобы изменить приоритет процесса просто установите на него курсор и нажимайте F7 для уменьшения числа (увеличения приоритета) или F8 для увеличения числа.

Завершение процессов в Linux

Если процесс завис и не отвечает, его необходимо завершить. В htop, чтобы убить процесс Linux, просто установите курсор на процесс и нажмите F9:

Система для управления процессами использует определенные сигналы, есть сигналы, которые указывают процессу завершиться. Вообще сигналов есть несколько десятков, но мы не будем их рассматривать. Вот несколько основных сигналов:

  • SIGTERM попросить процесс сохранить данные и завершится
  • SIGKILL завершить процесс немедленно, без сохранения

Если не убивается процесс Linux

Во время использования операционной системы Linux возникают ситуации, при которых процессы зависают и вы не можете их завершить. Например, вы хотите закрыть графическую программу или сервис, отправляете сигнал TERM, что в переводе означает завершить, а программа не реагирует на него.

Для того, чтобы программа могла завершится с помощью сигнала TERM, она должна быть в рабочем состоянии. Это сигнал просит программу завершится. Если программа зависла, она может попросту не получить ваш сигнал. Или программа может его обработать, но не завершатся, этот сигнал носит рекомендательный характер. Вот возможные причины и варианты решения:

  1. Недостаточно прав вы не можете убить процесс, запущенный от имени другого пользователя, используйте sudo
  2. Программа зависла необходимо ей послать сигнал KILL
  3. Программа стала зомби необходимо уничтожить её родительский процесс
  4. Программа ждет ответа от драйвера ждать или перезапустить компьютер

Команда kill принимает два аргумента: номер или имя сигнала и PID процесса, который надо завершить:

kill [опция] PID

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

kill PID

Если завершить задачу с помощью kill PID не удалось, нужно использовать специальные сигналы:

  • SIGTERM (15) сигнал, который используется по умолчанию и сообщает процессу о завершении. Большинство программ при получении SIGTERM без каких-либо заминок освобождают ресурсы, завершают операции и корректно закрываются с сохранением данных
  • KILL (9) отправляет процессу команду на принудительное завершение. Используется, если задача игнорирует сигнал SIGTERM и продолжает выполняться
  • SIGHUP (1) используется при изменении файла конфигурации. Позволяет процессу применить новые настройки конфигурации
  • SIGUSR1 (30) посылает определенный пользователем сигнал

Нужно попробовать завершить программу с помощью сигнала KILL, для этого передайте -KILL или -9 в виде опции утилите kill:

kill -KILL идентификатор_процесса

Ограничение процессов

С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Запись в файле имеет следующий вид:

<домен> <тип> <элемент> <значение>
  • домен имя пользователя, группы или UID
  • тип вид ограничений — soft или hard
  • элемент ресурс который будет ограничен
  • значение необходимый предел

Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.

Рассмотрим основные ограничения, которые можно применить к процессам:

  • nofile максимальное количество открытых файлов
  • as максимальное количество оперативной памяти
  • stack максимальный размер стека
  • cpu максимальное процессорное время
  • nproc максимальное количество ядер процессора
  • locks количество заблокированных файлов
  • nice максимальный приоритет процесса

Например, ограничим процессорное время для процессов пользователя sergiy:

sergiy hard nproc 20

Посмотреть ограничения для определенного процесса вы можете в папке proc:

cat /proc/PID/limits
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 204800 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 23562 23562 processes
Max open files 1024 4096 files
Max locked memory 18446744073708503040 18446744073708503040 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 23562 23562 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

Ограничения, измененные, таким образом вступят в силу после перезагрузки. Но мы можем и устанавливать ограничения для текущего командного интерпретатора и создаваемых им процессов с помощью команды ulimit, вот опции команды:

  • -S мягкое ограничение
  • -H жесткое ограничение
  • -a вывести всю информацию
  • -f максимальный размер создаваемых файлов
  • -n максимальное количество открытых файлов
  • -s максимальный размер стека
  • -t максимальное количество процессорного времени
  • -u максимальное количество запущенных процессов
  • -v максимальный объем виртуальной памяти

Например, мы можем установить новое ограничение для количества открываемых файлов:

ulimit -Sn 1024

Теперь смотрим:

ulimit -Sn
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!