Все, что вам нужно знать о процессах в 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, которые вы можете использовать для просмотра списка активных процессов. Откройте ссылку ниже, чтобы узнать о них больше:
- 20 инструментов командной строки для мониторинга производительности Linux
- 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, откройте ссылки ниже:
- Руководство по командам Kill, Pkill и Killall для завершения процесса Linux
- Как найти и завершить запущенные процессы в 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 и контролировать их.
- Управление процессами Linux: загрузка, завершение работы и все, что между ними
- Найдите 15 лучших процессов по использованию памяти с помощью «top» в пакетном режиме
- Найдите наиболее запущенные процессы по максимальному использованию памяти и процессора в Linux
- Как найти имя процесса по номеру PID в Linux
На данный момент это все! Если у вас есть вопросы или дополнительные идеи, поделитесь ими с нами через форму обратной связи ниже.