Наши партнеры

UnixForum




Детектив Москва | Дистанционная расшифровка снимков по материалам http://rdc.tatar. | Безрамное остекление в Краснодаре

Библиотека сайта rus-linux.net

Все, что вам нужно знать о процессах в Linux

Оригинал: All You Need To Know About Processes in Linux [Comprehensive Guide]
Автор: Aaron Kili
Дата публикации: 31 марта 2017 года
Перевод: А. Кривошей
Дата перевода: август 2017 г.

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

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

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

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

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

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

процессы в linux

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

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

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

1. С помощью функции System(). Этот способ сравнительно прост, однако неэффективен и создает определенные риски с точки зрения безопасности.
2. С помощью функций fork() и exec() - более продвинутая техника с точки зрения гибкости, скорости и безопасности.

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

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

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

Процесс Init

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

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

Для определения ID процесса можно использовать команду pidof:

# pidof systemd
# pidof top
# pidof httpd

определение ID процесса

Найти ID процесса и ID родительского процесса для системной оболочки можно с помощью команд:

$ echo $$
$ echo $PPID

поиск родительского ID процесса

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

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

# cloudcmds

запуск процесса

Фоновые процессы в Linux

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

# cloudcmd &
# jobs

запуск фонового процесса

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

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

Для продолжения выполнения приостановленного в фоне процесса, используется команда bg:

# bg

Для перевода процесса из фонового режима на передний план используется команда fg вместе с ID:

# jobs
# fg %1

перевод процесса из фонового режима на передний план

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

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

Running (работа) - процесс работает (он является текущим процессом в системе) или готов к работе (ждет выделения ресурсов процессора).
Waiting (ожидание) - в этом состоянии процесс ждет события, которое должно запустить его, или выделения системных ресурсов.
Кроме того, ядро системы делит процессы в состоянии ожидания на два типа: перываемые процессы, состояние ожидания которых может быть прервано сигналом, и непрерываемые, состояние ожидания которых может быть прервано только аппаратным способом.
Stopped (остановка) - в этом состоянии процесс останавливает работу, обычно после получения соответствующего сигнала. Например, процесс может быть остановлен для отладки.
Zombie (зомби) - процесс мертв, то есть он был остановлен, но в системе осталась выполняемая им задача.

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

В Linux есть несколько утилит для просмотра запущенных в системе процессов, наиболее широко известны команды ps и top:

1. Команда ps

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

# ps 
# ps -e | head 

ps

2. top – утилита системного мониторинга

top - это мощная утилита, которая позволяет в режиме реального времени просматривать список запущенных процессов, как показано ниже:

# top

top

3. glances – утилита системного мониторинга

glances - это сравнительно новая утилита для мониторинга активности системы с продвинутыми возможностями:

# glances

glances

Есть также еще несколько полезных программ, которые вы можете использовать для просмотра списка активных процессов, почитать о них можно по ссылкам ниже.

20 Command Line Tools to Monitor Linux Performance

13 More Useful Linux Monitoring Tools

Управление процессами в 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

команды для управления процессами

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

A Guide to Kill, Pkill and Killall Commands to Terminate Linux Processess

How to Find and Kill Running Processes in Linux

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

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

Фундаментальный способ управления процессами в Linux - это отправка им сигналов, которых имеется достаточно много. Посмотреть список всех сигналов можно с помощью команды:

$ kill -l

сигналы

Для отправки сигналов процессу используются описанные выше команды kill, pkill или pgrep. Однако программа ответит на сигнал, только если она запрограммирована распознавать такой сигнал.

Большинство сигналов предназначены для использования системой или программистами при написании кода. Следующие сигналы могут быть полезны пользователю:

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

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

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

Для завершения программы с использованием ее названия используются команды pkill или killall:

$ pkill firefox
$ killall firefox 

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

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

Однако пользователь с привилегиями root может менять приоритет с помощью команд nice и renice.
В выводе команды top столбец NI отображает значения nice для процессов.

$ top  

top

Вы можете использовать команду nice, чтобы задать значение nice процесса. Не забывайте, что обычный пользователь может присвоить процессу значение nice от 0 до 20, только если это процесс ему принадлежит.
Отрицательные значения nice может использовать только пользователь root.

Для понижения приоритета процесса используется команда renice:

$ renice +8  2687
$ renice +8  2103 

Это все!

Другие статьи об управлении процессами в Linux вы найдете на странице "Процессы в Linux-системе".