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

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

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

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

В конечном итоге PID повторяются, потому что все возможные числа израсходованы, и следующий PID катится или начинается заново. В любой момент времени в системе не существует двух процессов с одинаковым 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 команде нужен какой-либо ввод (чего нет), она переходит в состояние остановки, пока мы не переместим ее на передний план и не передадим ей данные с клавиатуры.

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

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

[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

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

2

PID

ID процесса

3

PPID

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

4

C

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

5

STIME

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

6

TTY

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

7

TIME

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

8

CMD

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

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

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

-a

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

2

-x

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

3

-u

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

4

-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 (ID родительского процесса). В некоторых случаях эти процессы называют бесхозными.

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

Демонические процессы

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

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

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

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

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

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

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

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

$top

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

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

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