Поиск по сайту:

Все, что вам нужно знать о процессах в Linux [Подробное руководство]


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

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

Типы процессов

В Linux существует два основных типа процессов:

  • Приоритетные процессы (также называемые интерактивными процессами) – они инициализируются и управляются через сеанс терминала. Другими словами, для запуска таких процессов должен быть подключен к системе пользователь; они не запускались автоматически как часть системных функций/служб.
  • Фоновые процессы (также называемые неинтерактивными/автоматическими процессами) – это процессы, не подключенные к терминалу; они не ожидают никакого пользовательского ввода.

Что такое демоны

Это особые типы фоновых процессов, которые запускаются при запуске системы и продолжают работать вечно как служба; они не умирают. Они запускаются как системные задачи (запускаются как службы) спонтанно. Однако ими может управлять пользователь через процесс инициализации.

Создание процессов в Linux

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

Существует два традиционных способа создания нового процесса в Linux:

  • Использование функции System() – этот метод относительно прост, однако он неэффективен и имеет значительные риски для безопасности.
  • Использование функций fork() и exec() – этот метод немного продвинут, но обеспечивает большую гибкость, скорость и безопасность.

Как Linux идентифицирует процессы?

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

Программа идентифицируется по идентификатору процесса (PID), а также идентификатору родительского процесса (PPID), поэтому процессы можно разделить на следующие категории:

  • Родительские процессы – это процессы, которые создают другие процессы во время выполнения.
  • Дочерние процессы — эти процессы создаются другими процессами во время выполнения.

Процесс инициализации

Процесс Init является материнским (родительским) для всех процессов в системе, это первая программа, которая запускается при загрузке системы Linux; он управляет всеми остальными процессами в системе. Он запускается самим ядром, поэтому в принципе не имеет родительского процесса.

Процесс инициализации всегда имеет идентификатор процесса 1. Он действует как приемный родитель для всех потерянных процессов.

Вы можете использовать команду pidof, чтобы найти идентификатор процесса:

pidof systemd
pidof top
pidof httpd

Чтобы найти идентификатор процесса и идентификатор родительского процесса текущей оболочки, запустите:

echo $$
echo $PPID

Запуск процесса в Linux

Как только вы запустите команду или программу (например, cloudcmd – CloudCommander), она запустит процесс в системе. Вы можете запустить приоритетный (интерактивный) процесс следующим образом: он будет подключен к терминалу, и пользователь сможет отправить его:

cloudcmd

Фоновые задания Linux

Чтобы запустить процесс в фоновом режиме (неинтерактивном), используйте символ &. Здесь процесс не считывает вводимые пользователем данные до тех пор, пока он не будет переведен на передний план.

cloudcmd &
jobs

Вы также можете отправить процесс в фоновый режим, приостановив его с помощью [Ctrl + Z], это отправит процессу сигнал SIGSTOP, тем самым остановив его работу; он становится праздным:

tar -cf backup.tar /backups/*  #press Ctrl+Z
jobs

Чтобы продолжить выполнение приостановленной выше команды в фоновом режиме, используйте команду bg:

bg

Чтобы отправить фоновый процесс на передний план, используйте команду fg вместе с идентификатором задания следующим образом:

jobs
fg %1

Вам также может быть интересно: Как запустить команду Linux в фоновом режиме и отсоединить процесс в терминале

Состояния процесса в Linux

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

  • Выполняется – здесь он либо запущен (это текущий процесс в системе), либо готов к запуску (он ожидает назначения одному из процессоров).
  • Ожидание – в этом состоянии процесс ожидает возникновения события или системного ресурса. Кроме того, ядро также различает два типа процессов ожидания; прерываемые процессы ожидания – могут быть прерваны сигналами, а непрерываемые процессы ожидания – ожидают непосредственно аппаратных условий и не могут быть прерваны каким-либо событием/сигналом.
  • Остановлен – в этом состоянии процесс остановлен, обычно путем получения сигнала. Например, процесс, который отлаживается.
  • Зомби – здесь процесс мертв, он остановлен, но о нем все еще есть запись в таблице процессов.

Как просмотреть активные процессы в Linux

Существует несколько инструментов Linux для просмотра/списка запущенных процессов в системе. Двумя традиционными и хорошо известными являются команды ps и top:

1. Команда ps

Он отображает информацию о выбранных активных процессах в системе, как показано ниже:

ps 
ps -e | head 

2. вверху — инструмент мониторинга системы.

top — мощный инструмент, который предлагает вам динамическое представление работающей системы в реальном времени, как показано на снимке экрана ниже:

top 

Прочтите это, чтобы узнать больше о лучших примерах использования: 12 лучших примеров команд в Linux.

3. взгляды – инструмент мониторинга системы

glances — относительно новый инструмент для мониторинга системы с расширенными функциями:

glances

Подробное руководство по использованию можно найти в разделе Glances — расширенный инструмент мониторинга системы в реальном времени для Linux.

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

  1. 20 инструментов командной строки для мониторинга производительности Linux
  2. 13 более полезных инструментов мониторинга Linux

Как управлять процессами в Linux

В Linux также есть некоторые команды для управления процессами, такие как kill, pkill, pgrep и killall. Ниже приведены несколько основных примеров их использования:

pgrep -u tecmint top
kill 2308
pgrep -u tecmint top
pgrep -u tecmint glances
pkill glances
pgrep -u tecmint glances

Чтобы узнать, как более подробно использовать эти команды для уничтожения/завершения активных процессов в Linux, откройте ссылки ниже:

  1. Руководство по командам Kill, Pkill и Killall для завершения процесса Linux
  2. Как найти и завершить запущенные процессы в Linux

Обратите внимание, что вы можете использовать их для закрытия не отвечающих приложений в Linux, когда ваша система зависает.

Отправка сигналов процессам

Основной способ управления процессами в Linux — посылка им сигналов. Существует несколько сигналов, которые вы можете отправить процессу, чтобы просмотреть все запущенные сигналы:

kill -l

Чтобы отправить сигнал процессу, используйте команды kill, pkill или pgrep, о которых мы упоминали ранее. Но программы могут реагировать на сигналы только в том случае, если они запрограммированы на распознавание этих сигналов.

И большинство сигналов предназначены для внутреннего использования системой или для программистов, когда они пишут код. Ниже приведены сигналы, которые могут быть полезны пользователю системы:

  • SIGHUP 1 – отправляется процессу, когда его управляющий терминал закрыт.
  • SIGINT 2 – отправляется процессу управляющим терминалом, когда пользователь прерывает процесс, нажимая [Ctrl+C].
  • SIGQUIT 3 — отправляется процессу, если пользователь отправляет сигнал выхода [Ctrl+D].
  • SIGKILL 9 – этот сигнал немедленно завершает (убивает) процесс, и процесс не будет выполнять никаких операций очистки.
  • SIGTERM 15 – это сигнал завершения программы (по умолчанию kill отправит его).
  • SIGTSTP 20 – отправляется процессу управляющим терминалом с просьбой остановить его (остановку терминала); инициируется нажатием пользователем [Ctrl+Z].

Ниже приведены примеры команд уничтожения для закрытия приложения Firefox с использованием его PID после его зависания:

pidof firefox
kill 9 2687
OR
kill -KILL 2687
OR
kill -SIGKILL 2687  

Чтобы завершить работу приложения по его имени, используйте pkill или killall следующим образом:

pkill firefox
killall firefox 

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

В системе Linux все активные процессы имеют приоритет и определенное значение. Процессы с более высоким приоритетом обычно получают больше процессорного времени, чем процессы с более низким приоритетом.

Однако пользователь системы с правами root может повлиять на это с помощью команд nice и renice.

Из выходных данных команды top NI показывает хорошее значение процесса:

top  

Используйте команду nice, чтобы установить хорошее значение для процесса. Имейте в виду, что обычные пользователи могут присвоить своим процессам приятное значение от 0 до 20.
Только пользователь root может использовать отрицательные значения nice.

Чтобы renice приоритет процесса, используйте команду renice следующим образом:

renice +8  2687
renice +8  2103

Ознакомьтесь с нашими полезными статьями о том, как управлять процессами Linux и контролировать их.

  1. Управление процессами Linux: загрузка, завершение работы и все, что между ними
  2. Найдите 15 лучших процессов по использованию памяти с помощью «top» в пакетном режиме
  3. Найдите наиболее запущенные процессы по максимальному использованию памяти и процессора в Linux
  4. Как найти имя процесса по номеру PID в Linux

На данный момент это все! Если у вас есть вопросы или дополнительные идеи, поделитесь ими с нами через форму обратной связи ниже.