Учебники

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

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

Всякий раз, когда вы запускаете команду в Unix, она создает или запускает новый процесс. Когда вы попробовали команду ls для просмотра содержимого каталога, вы запустили процесс. Проще говоря, процесс является экземпляром работающей программы.

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

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

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

Когда вы запускаете процесс (запускаете команду), вы можете запустить его двумя способами:

  • Процессы переднего плана
  • Фоновые процессы

Процессы переднего плана

По умолчанию каждый запускаемый вами процесс выполняется на переднем плане. Он получает свой ввод с клавиатуры и отправляет свой вывод на экран.

Это можно увидеть с помощью команды ls . Если вы хотите перечислить все файлы в вашем текущем каталоге, вы можете использовать следующую команду —

$ls ch*.doc

Это отобразит все файлы, имена которых начинаются с ch и заканчиваются на .doc

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Процесс выполняется на переднем плане, вывод направлен на мой экран, и, если команда ls хочет какой-либо ввод (чего нет), она ждет его с клавиатуры.

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

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

Фоновый процесс выполняется без подключения к клавиатуре. Если фоновый процесс требует ввода с клавиатуры, он ждет.

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

Самый простой способ запустить фоновый процесс — добавить амперсанд ( & ) в конце команды.

$ls ch*.doc &

Здесь отображаются все те файлы, имена которых начинаются с ch и заканчиваются на .doc

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

Здесь, если команда ls хочет какой-либо ввод (чего нет), она переходит в состояние остановки, пока мы не переместим ее на передний план и не передадим ей данные с клавиатуры.

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

Нажмите клавишу ввода, и вы увидите следующее —

[1]   +   Done                 ls ch*.doc &
$

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

Список запущенных процессов

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

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

Одним из наиболее часто используемых флагов для ps является параметр -f (f для полного), который предоставляет дополнительную информацию, как показано в следующем примере —

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

Вот описание всех полей, отображаемых командой ps -f

Sr.No. Колонка и описание
1

UID

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

2

PID

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

3

PPID

ID родительского процесса (идентификатор процесса, который его запустил)

4

С

Загрузка процессора процессом

5

STIME

Время начала процесса

6

TTY

Тип терминала, связанный с процессом

7

ВРЕМЯ

Процессорное время, затраченное на процесс

8

CMD

Команда, которая запустила этот процесс

UID

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

PID

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

PPID

ID родительского процесса (идентификатор процесса, который его запустил)

С

Загрузка процессора процессом

STIME

Время начала процесса

TTY

Тип терминала, связанный с процессом

ВРЕМЯ

Процессорное время, затраченное на процесс

CMD

Команда, которая запустила этот процесс

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

Sr.No. Вариант и описание
1

-a

Показывает информацию обо всех пользователях

2

-Икс

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

3

-u

Показывает дополнительную информацию, такую ​​как опция -f

4

-e

Отображает расширенную информацию

-a

Показывает информацию обо всех пользователях

-Икс

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

-u

Показывает дополнительную информацию, такую ​​как опция -f

-e

Отображает расширенную информацию

Остановка процессов

Завершение процесса может быть сделано несколькими различными способами. Часто из консольной команды отправка комбинации клавиш CTRL + C (символ прерывания по умолчанию) приводит к завершению команды. Это работает, когда процесс работает в режиме переднего плана.

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

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

Здесь команда kill завершает процесс first_one . Если процесс игнорирует обычную команду kill, вы можете использовать kill -9 с последующим идентификатором процесса следующим образом:

$kill -9 6738
Terminated

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

Каждому unix-процессу присвоены два идентификационных номера: идентификатор процесса (pid) и идентификатор родительского процесса (ppid). Каждый пользовательский процесс в системе имеет родительский процесс.

Большинство выполняемых вами команд имеют оболочку в качестве родителя. Посмотрите пример ps -f, где эта команда перечисляет как идентификатор процесса, так и идентификатор родительского процесса.

Зомби и сиротские процессы

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

Когда процесс завершен, список ps может по-прежнему отображать процесс с состоянием Z. Это зомби или несуществующий процесс. Процесс мертв и не используется. Эти процессы отличаются от бесхозных процессов. Они завершили выполнение, но все еще находят запись в таблице процессов.

Процессы Демона

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

У демона нет управляющего терминала. Не может открыть / dev / tty . Если вы выполните команду ps -ef и посмотрите на поле tty , все демоны будут иметь ? для tty .

Точнее говоря, демон — это процесс, который работает в фоновом режиме, обычно ожидая чего-то, с чем он способен работать. Например, демон принтера, ожидающий команды печати.

Если у вас есть программа, которая требует длительной обработки, то стоит сделать ее демоном и запускать ее в фоновом режиме.

Верхняя Команда

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

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

Вот простой синтаксис для запуска команды top и просмотра статистики использования процессора различными процессами:

$top

Идентификатор задания и идентификатор процесса

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

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