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

We use cookies. Read the Privacy and Cookie Policy

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

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

Каждый раз, когда вы запускаете на выполнение программу, вы начинаете то, что в литературе именуется как процесс. Или другими словами – процессом называется выполняемая в данный момент программа или ее потомки. Каждый процесс запускается от имени какого-то пользователя. Процессы, которые стартовали при загрузке, обычно выполняются от имени пользователей root или nobody.

Каждый пользователь может управлять поведением процессов, им запущенных. При этом пользователь root может управлять всеми процессами – как запущенными от его имени, так и процессами, порожденными другими пользователями операционной системы. Управление процессами осуществляется с помощью утилит, а также при помощи некоторых команд командной оболочки (shell).

Каждый процесс в системе имеет уникальный номер – идентификационный номер процесса (Process Identification, PID). Этот номер используется ядром операционной системы, а также некоторыми утилитами для управления процессами.

Выполнение процесса на переднем плане и в фоновом режиме

Процессы могут выполняться на переднем плане (foreground) – режим по умолчанию и в фоновом режиме (background). На переднем плане в каждый момент для текущего терминала может выполняться только один процесс. Однако пользователь может перейти в другой виртуальный терминал и запустить на выполнение еще один процесс, а на другом терминале еще один и т. д. Процесс переднего плана – это процесс, с которым вы взаимодействуете, он получает информацию с клавиатуры (стандартный ввод) и посылает результаты на ваш экран (стандартный вывод).

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

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

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

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

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

/home/vasya# yes > /dev/null &;

[1] 123

/home/vasya#

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

Число [1] означает номер запущенного нами фонового процесса. Как вы узнаете несколько позже, с его помощью можно будет производить манипуляции с нашим фоновым процессом. Значение 12 3 показывает идентификационный номер (PID) нашего процесса. Отличия этих двух чисел достаточно существенные. Номер фонового процесса уникален только для пользователя, запускающего данный фоновый процесс. То есть если у нас в системе три пользователя решили запустить фоновый процесс (первый для текущего сеанса) – в результате у каждого пользователя появится фоновый процесс с номером [1]. Напротив, идентификационный номер процесса (PID) уникален для всей операционной системы и однозначно идентифицирует в ней каждый процесс. Спрашивается, для чего тогда вводить нумерацию фонового процесса для пользователя? Для удобства. Номер фонового процесса хранится в переменных командной оболочки пользователя и позволяет не забивать голову цифрами типа 2693 или 1294, а использовать переменные вида %1, %2. Однако допускается пользоваться и идентификационным номером процесса.

Для проверки состояния фоновых процессов можно воспользоваться командой командной оболочки – jobs.

/home/vasya# jobs

[1]+ Running yes >/dev/null &

/home/vasya#

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

Остановка и возобновление процесса

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

1. Запустить процесс выполняться на переднем плане.

2. Остановить выполнение процесса.

3. Продолжить процесс в фоновом режиме.

Для выполнения программы введем ее имя в командной строке и запустим на выполнение. Для остановки выполнения программы необходимо нажать на клавиатуре следующую комбинацию клавиш – <Ctrl>+<Z>. После этого вы увидите на экране следующее:

/home/vasya# yes > /dev/null

ctrl+Z

[1]+ Stopped yes >/dev/null

/home/vasya#

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

bg %1

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

fg %1

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

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

Как остановить выполнение фонового процесса? Использование комбинации клавиш <Ctrl>+<Z> не поможет, поскольку процесс находится в фоновом режиме и не реагирует на ввод данных с консоли. Для решения этой проблемы следует переместить процесс на передний план, а затем остановить.

Завершение работы процесса

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

• Вариант первый. Если процесс интерактивный, как правило, в документации или прямо на экране написано, как корректно завершить программу.

• Вариант второй. В том случае, если вы не знаете, как завершить текущий процесс (не фоновый), можно воспользоваться клавиатурной комбинацией <Ctrl>+<C>. Попробуйте также комбинацию клавиш <Ctrl>+<Break>. А для остановки фонового процесса можно перевести его на передний план, а затем уже воспользоваться вышеприведенными клавиатурными комбинациями.

• Вариант третий и самый действенный. В том случае, если вам не удалось прекратить выполнение процесса вышеприведенными способами – например программа зависла или «слетел» терминал – для завершения процесса можно воспользоваться следующими командами: kill, killall.

Команда kill может получать в качестве аргумента как номер процесса, так и идентификационный номер (PID) процесса. Таким образом, команда

/home/vasya# kill 123

эквивалентна команде

/home/vasya# kill %1

Можно видеть, что не надо использовать "%", когда вы обращаетесь к работе по идентификационному номеру (PID) процесса.

С помощью команды killall можно прекратить выполнение нескольких процессов сразу, имеющих одно и то же имя. Например, команда killall mc прекратит работу всех программ тс, запущенных от имени данного пользователя.

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

Программы, используемые для управления процессами

Существует достаточно большое количество утилит, используемых для управления тем или иным способом процессами, исполняемыми в операционной системе. Здесь мы рассмотрим только основные такие утилиты. В табл. 26.1 приведен список основных программ, тем или иным образом предназначенных для управления процессами.

Таблица 26.1. Программы управления процессами

nohup

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

nohup выполняемая_фоновая_команда &

ps

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

Простой запуск ps без параметров выдаст список программ, выполняемых на терминале. Обычно этот список очень мал:

PID TTY TIME CMD

885 tty1 00:00:00 login

893 tty1 00:00:00 bash

955 tty1 00:00:00 ps

Что означает полученная информация?

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

• Следующий столбец – TTY – показывает, на каком терминале процесс выполняется. Запуск команды без параметров ps покажет процессы, выполняемые на текущем терминале.

• Столбец TIME показывает, сколько процессорного времени выполняется процесс. Оно не является фактическим временем с момента запуска процесса, поскольку Linux – это многозадачная операционная система. Информация, указанная в столбце time, показывает время, реально потраченное процессором на выполнение процесса.

• Столбец CMD показывает, что же это за программа. Отображается только имя программы, опции командной строки не выводится.

Для получения расширенного списка процессов, выполняемых в системе, используется следующая команда:

ps -ах

PID TTY STAT TIME COMMAND

1 ? S 0:04 init

2 ? SW 0:00 [keventd]

3 ? SW 0:00 [kapm-idled]

4 ? SWN 0:00 [ksoftirqd_CPU0]

5 ? SW 0:00 [kswapd]

6 ? SW 0:00 [kreclaimd]

7 ? SW 0:00 [bdflush]

8 ? SW 0:00 [kupdated]

9 ? SW< 0:00 [mdrecoveryd]

13 ? SW 0:00 [kjournald]

437 ? S 0:00 syslogd -m 0

442 ? S 0:00 klogd -2

462 ? S 0:00 portmap

490 ? S 0:00 rpc.statd

647 ? S 0:00 /usr/sbin/sshd

704 ? S 0:00 lpd Waiting

732 ? S 0:00 sendmail: accepting connections

751 ? S 0:00 gpm -t ps/2 -m /dev/mouse

769 ? S 0:00 crond

835 ? S 0:00 xfs -droppriv -daemon

853 ? S 0:00 anaсron

871 ? S 0:00 /usr/sbin/atd

885 tty1 S 0:00 login – root

886 tty2 S 0:00 /sbin/mingetty tty2

887 tty3 S 0:00 /sbin/mingetty tty3

888 tty4 S 0:00 /sbin/mingetty tty4

889 tty5 S 0:00 /sbin/mingetty tty5

890 tty6 S 0:00 /sbin/mingetty tty6

893 tty1 S 0:00 -bash

1037 tty1 R 0:00 /usr/bin/mc -P

1038 ? S 0:00 cons.saver /dev/ttyl

1039 pts/0 S 0:00 bash -rcfile .bashrc

1067 pts/0 R 0:00 ps -ax

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

Появился новый столбец – stat. В этом столбце отображается состояние (status) процесса. Полный список состояний вы можете прочитать в описании программы ps, а пока – самые важные состояния:

• буква R обозначает запущенный процесс, исполняющийся в данный момент времени;

• буква S обозначает спящий (sleeping) процесс – процесс ожидает какое-то событие, необходимое для его активизации;

• буква Z используется для обозначения «зомбированных» процессов (zombied) – это процессы, родительский процесс которых прекратил свое существование, оставив дочерние процессы рабочими.

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

Если вы хотите увидеть еще больше информации о выполняемых процессах, попробуйте выполнить команду:

Как вы видите – информации прибавилось. Появились еще следующие столбцы:

• USER – показывает, от имени какого пользователя был запущен данный процесс;

• %CPU, %МЕМ – показывают, сколько данный процесс занимает соответственно процессорного времени и объем используемой оперативной памяти;

• TIME – время запуска программы.

В табл. 26.2 приведены некоторые параметры командной строки программы ps.

Таблица 26.2. Параметры командной строки программы ps

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

Данный текст является ознакомительным фрагментом.