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