Что такое родительский процесс

Администрирование систем Linux. Вводная информация об управлении процессами

Часть I. Управление процессами

Глава 1. Вводная информация об управлении процессами

1.1. Терминология

Процесс является скомпилированным исходным кодом, исполняющимся в текущее время в системе.

1.1.2. Идентификатор процесса PID

Каждый из процессов имеет идентификатор или PID (сокращение process id ).

1.1.3. Идентификатор родительского процесса PPID

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

1.1.5. Уничтожение процесса

Завершение работы процесса чаще всего достигается благодаря его уничтожению, поэтому в том случае, если вы хотите остановить исполнение процесса, вы должны уничтожить его.

1.2. Базовые приемы управления процессами

1.2.3. Родительские и дочерние процессы

1.2.4. Системные вызовы fork и exec

Кроме того, вы можете осуществлять вывод списка найденных идентификаторов процессов с соответствующими им именами процессов.

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

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

Утилита kill позволяет уничтожить процесс (или остановить его исполнение). В примере ниже показана стандартная методика использования утилиты kill для остановки исполнения процесса с идентификатором 1942.

На самом деле в процессе использования утилиты kill осуществляется передача сигнала процессу.

1.3.2. Список сигналов

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

Команды в примере ниже являются идентичными.

1.3.6. Сигналы SIGSTOP и SIGCONT

Вы можете использовать утилиту pkill для завершения работы процесса на основе его имени.

1.3.8. Утилита killall

Утилита killall позволяет отправлять сигнал 15 всем процессам с определенным именем.

1.3.9. Утилита killall5

1.4. Практическое задание: вводная информация об управлении процессами

3. Используйте команду who i am для установления имени пользователя, под которым вы работаете с терминалом.

4. Располагая полученной ранее информацией о вашем имени пользователя, примените утилиту ps для поиска всех процессов, запущенных с помощью вашего терминала.

5. Каков идентификатор процесса вашей командной оболочки?

6. Каков идентификатор родительского процесса вашей командной оболочки?

1.5. Корректная процедура выполнения практического задания: вводная информация об управлении процессами

3. Используйте команду who i am для установления имени пользователя, под которым вы работаете с терминалом.

4. Располагая полученной ранее информацией о вашем имени пользователя, примените утилиту ps для поиска всех процессов, запущенных с помощью вашего терминала.

или может быть использована аналогичная команда

5. Каков идентификатор процесса вашей командной оболочки?

2973 в примере выше, в вашем случае наверняка будет использоваться отличный идентификатор процесса

6. Каков идентификатор родительского процесса вашей командной оболочки?

2972 в примере выше, в вашем случае наверняка будет использоваться отличный идентификатор родительского процесса

7. Запустите в фоновом режиме с помощью команд sleep 3342 два экземпляра процесса.

Источник

Процесcы в операционной системе Linux (основные понятия)

Основными активными сущностями в системе Linux являются процессы. Каждый процесс выполняет одну программу и изначально получает один поток управления. Иначе говоря, у процесса есть один счетчик команд, который отслеживает следующую исполняемую команду. Linux позволяет процессу создавать дополнительные потоки (после того, как он начинает выполнение).

Linux представляет собой многозадачную систему, так что несколько независимых процессов могут работать одновременно. Более того, у каждого пользователя может быть одновременно несколько активных процессов, так что в большой системе могут одновременно работать cотни и даже тысячи процессов. Фактически на большинстве однопользовательских рабочих станций (даже когда пользователь куда-либо отлучился) работают десятки фоновых процессов, называемых демонами (daemons). Они запускаются при загрузке системы из сценария оболочки.

Типичным демоном является cron. Он просыпается раз в минуту, проверяя, не нужно ли ему что-то сделать. Если у него есть работа, то он ее выполняет, а затем отправляется спать дальше (до следующей проверки).

Этот демон позволяет планировать в системе Linux активность на минуты, часы, дни и даже месяцы вперед. Например, представьте, что пользователю назначено явиться во военкомат в 3 часа дня в следующий вторник. Он может создать запись в базе данных демона cron, чтобы тот просигналил ему, скажем, в 14:30. Когда наступает назначенный день и время, демон cron видит, что у него есть работа, и запускает в назначенное время программу звукового сигнала (в виде нового процесса).

Демон cron также используется для периодического запуска задач, например ежедневного резервного копирования диска в 4 часа ночи или напоминания забывчивым пользователям каждый год за неделю до 31 декабря купить подарки для празднования нового года. Другие демоны управляют входящей и исходящей электронной почтой, очередями принтера, проверяют, достаточно ли еще осталось свободных страниц памяти и т.д. Демоны реализуются в системе Linux довольно просто, так как каждый из них представляет собой отдельный процесс, независимый от всех остальных процессов.

Процессы создаются в операционной системе Linux очень просто. Системный вызов fork создает точную копию исходного процесса, называемого родительским процессом (parent process). Новый процесс называется дочерним процессом (child process). У родительского и у дочернего процессов есть свои собственные (приватные) образы памяти. Если родительский процесс впоследствии изменяет какие-либо свои переменные, то эти изменения остаются невидимыми для дочернего процесса (и наоборот).

Открытые файлы используются родительским и дочерним процессами совместно. Это значит, что если какой-либо файл был открыт в родительском процессе до выполнения системного вызова fork, то он останется открытым в обоих процессах и в дальнейшем. Изменения, произведенные с этим файлом любым из процессов, будут видны другому. Такое поведение является единственно разумным, так как эти изменения будут видны также и любому другому процессу, который тоже откроет этот файл.

Тот факт, что образы памяти, переменные, регистры и все остальное и у родительского процесса, и у дочернего идентичны, приводит к небольшому затруднению: как процессам узнать, который из них должен исполнять родительский код, а который дочерний? Секрет в том, что системный вызов fork возвращает дочернему процессу число 0, а родительскому — отличный от нуля PID (Process IDentifier — идентификатор процесса) дочернего процесса. Оба процесса обычно проверяют возвращаемое значение и действуют соответственно:

pid = fork( ); /* если fork завершился успешно, pid > 0 в родительском процессе */
if (pid 0) <
/* здесь располагается родительский код */
> else <
/* здесь располагается дочерний код */
>

Если дочерний процесс желает узнать свой PID, то он может воспользоваться системным вызовом getpid. Идентификаторы процессов используются различным образом. Например, когда дочерний процесс завершается, его родитель получает PID только что завершившегося дочернего процесса. Это может быть важно, так как у родительского процесса может быть много дочерних процессов. Поскольку у дочерних процессов также могут быть дочерние процессы, то исходный процесс может создать целое дерево детей, внуков, правнуков и более дальних потомков.

В системе Linux процессы могут общаться друг с другом с помощью некой формы передачи сообщений. Можно создать канал между двумя процессами, в который один процесс сможет писать поток байтов, а другой процесс сможет его читать. Эти каналы иногда называют трубами (pipes). Синхронизация процессов достигается путем блокирования процесса при попытке прочитать данные из пустого канала. Когда данные появляются в канале, процесс разблокируется.

При помощи каналов организуются конвейеры оболочки. Когда оболочка видит строку вроде
sort

Источник

Изучаем процессы в Linux. Управление процессами

Обновл. 12 Июл 2021 |

Процесс — это экземпляр запущенной программы. Всякий раз, когда в терминале выполняется какая-нибудь команда (например, команда pwd ), система создает/запускает новый процесс.

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

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

Процессы переднего плана (или «интерактивные процессы») — они инициализируются и управляются с помощью терминального сеанса. Другими словами, необходимым условием для запуска таких процессов является наличие пользователя, подключенного к системе; они не запускаются автоматически как часть системных функций/служб. Когда команда/процесс выполняется на переднем плане, то они полностью занимают запустивший их терминал. Вы не сможете использовать другие команды, т.к. приглашение оболочки будет недоступно, пока данный процесс выполняется на переднем плане.

Фоновые процессы (или «автоматические процессы») — это процессы, не подключенные к терминалу; они не ожидают пользовательского ввода данных. Таким образом, другие процессы могут выполняться параллельно с процессом, запущенным в фоновом режиме, поскольку им не нужно ждать его завершения.

Демоны (англ. «daemons») — это особый тип фоновых процессов, которые запускаются при старте системы и продолжают работать в виде службы; они не умирают. Такие процессы запускаются как системные задачи (службы). Однако при этом они могут управляться пользователем через init-процесс (о котором мы поговорим чуть позже). Например, к демонам относится служба электронных сообщений sendmail и sshd — служба, принимающая от клиентов запросы на соединения по протоколу ssh. За исключением процесса init и некоторых других, процессы демонов обычно имеют окончание d в своем имени.

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

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

Процессы запущенной программы имеют уникальный пятизначный номер — PID (сокр. от «Process IDentificator»«идентификатор процесса»), а также PPID (сокр. от «Parent Process IDentificator»«идентификатор родительского процесса»). В связи с этим процессы дополнительно разделяют на две группы:

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

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

Прародителем всех процессов в системе является процесс init (от англ. «initialization») — первая программа, которая выполняется при загрузке Linux и управляет всеми другими процессами в системе. init запускается самим ядром и всегда имеет PID = 1, поэтому у него в принципе нет родительского процесса.

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

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

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

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Рассмотрим основные состояния процесса:

Выполнение — процесс либо запущен (текущий процесс в системе), либо готов к запуску (ожидает передачи на выполнение процессору).

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

прерываемые ожидающие процессы — могут быть прерваны сигналами;

непрерываемые ожидающие процессы — процессы ожидают непосредственно на аппаратном уровне и не могут быть прерваны каким-либо событием/сигналом.

Завершен — процесс был остановлен, как правило, путем получения сигнала штатного завершения работы exit().

Зомби — иногда, когда родительский процесс убивается до завершения дочернего процесса, дочерние процессы становятся «осиротевшими», при этом в качестве нового родителя (с соответствующим изменением PPID) им назначается процесс init. Убитые процессы, но при этом все еще отображающиеся в таблице процессов, называются процессами зомби (они мертвы и не используются).

Как получить идентификатор (PID) процесса

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

$ pidof init
$ pidof bash
$ pidof systemd

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Чтобы вывести PID и PPID текущей оболочки, выполните:

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Запуск интерактивного процесса в Linux

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

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

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

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

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

Чтобы запустить процесс в фоновом режиме, используйте символ & после имени запускаемой программы. В этом случае процесс не будет принимать пользовательский ввод, пока не переместится на передний план:

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

$ firefox #После Enter нажмите Ctrl+Z
$ jobs

Чтобы продолжить выполнение вышеупомянутой приостановленной команды в фоновом режиме, используйте команду bg (от англ. «begin»):

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

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Отслеживание активных процессов

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

Команда ps

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

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

UID — идентификатор пользователя, которому принадлежит процесс (тот, от чьего имени происходит выполнение).

PID — идентификатор процесса.

PPID — идентификатор родительского процесса.

C — загрузка CPU процессом.

STIME — время начала выполнения процесса.

TTY — тип терминала, связанного с процессом.

TIME — количество процессорного времени, потраченного на выполнение процесса.

CMD — команда, запустившая этот процесс.

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Есть и другие опции, которые можно использовать вместе с командой ps :

-a — показывает информацию о процессах по всем пользователям;

-x — показывает информацию о процессах без терминалов;

-u — показывает дополнительную информацию о процессе по заданному UID или имени пользователя;

-e — отображение расширенной информации.

Если вы хотите вывести вообще всю информацию по всем процессам системы, то используйте команду ps –aux :

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

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

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Если вы ходите выполнить сортировку по потреблению памяти (в порядке убывания), то добавьте к имени интересующего столбца знак минуса:

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Еще один очень популярный пример использования команды ps — это объединение её и команды grep для поиска заданного процесса по его имени:

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Команда top

Команда top отображает информацию о запущенных процессах в режиме реального времени:

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

PID — идентификатор процесса.

USER — пользователь, которому принадлежит процесс.

PR — приоритет процесса на уровне ядра.

VIRT — общий объем (в килобайтах) виртуальной памяти (физическая память самого процесса; загруженные с диска файлы библиотек; память, совместно используемая с другими процессами и т.п.), используемой задачей в данный момент.

RES — текущий объем (в килобайтах) физической памяти процесса.

SHR — объем совместно используемой с другими процессами памяти.

S (сокр. от «STATUS») — состояние процесса:

S (сокр. от «Sleeping») — прерываемое ожидание. Процесс ждет наступления события.

I (сокр. от «Idle») — процесс бездействует.

R (сокр. от «Running») — процесс выполняется (или поставлен в очередь на выполнение).

Z (сокр. от «Zombie») — зомби-процесс.

%CPU — процент используемых ресурсов процессора.

%MEM — процент используемой памяти.

TIME+ — количество процессорного времени, потраченного на выполнение процесса.

COMMAND — имя процесса (команды).

Также в сочетании с основными символами состояния процесса (S от «STATUS») вы можете встретить и дополнительные:

— процесс с высоким приоритетом;

N — процесс с низким приоритетом;

l — многопоточный процесс;

Примечание: Все процессы объединены в сессии. Процессы, принадлежащие к одной сессии, определяются общим идентификатором сессии — идентификатором процесса, который создал эту сессию. Лидер сессии — это процесс, идентификатор сессии которого совпадает с его идентификаторами процесса и группы процессов.

Команда glances

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

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

Примечание: Если в вашей системе отсутствует данная утилита, то установить её можно с помощью следующих команд:

$ sudo apt-get update
$ sudo apt-get install glances

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

Также в Linux присутствуют некоторые команды для управления процессами:

kill — посылает процессу сигнал завершения работы;

pkill — завершает процесс по его имени;

pgrep — ищет процесс по его имени (и, опционально, по имени запустившего его пользователя);

killall — завершает все активные процессы.

Ниже приведены несколько основных примеров их использования:

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

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

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

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

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

SIGHUP (1) — отправляется процессу, когда его управляющий терминал закрыт.

SIGINT (2) — отправляется процессу управляющим терминалом, когда пользователь прерывает процесс нажатием клавиш Ctrl+C.

SIGQUIT (3) — отправляется процессу, если пользователь посылает сигнал выхода Ctrl+D.

SIGKILL (9) — этот сигнал немедленно завершает (убивает) процесс, и процесс не будет выполнять никаких операций очистки за собой.

SIGTERM (15) — сигнал завершения программы (отправляется командой kill по умолчанию).

SIGTSTP (20) — отправляется процессу управляющим терминалом с запросом на остановку; инициируется пользователем нажатием клавиш Ctrl+Z.

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

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

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

Узнать значение приоритета команды можно по выводу команды top (столбец NI):

Что такое родительский процесс. Смотреть фото Что такое родительский процесс. Смотреть картинку Что такое родительский процесс. Картинка про Что такое родительский процесс. Фото Что такое родительский процесс

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

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

$ renice +8 5547
$ renice +8 1151

На данный момент это всё! Если у вас есть какие-либо вопросы или дополнительные идеи, вы можете поделиться ими с нами с помощью комментариев.

Поделиться в социальных сетях:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *