microbik.ru
1
Лабораторная работа 4

Работы и процессы в Linux
4 Управление работами

4.1 Работы и процессы

Управление работами (job control) это возможность, которую предоставляют многие оболочки, включая (Bash и Tcsh). Управление работами (прим. переводчика: job - работа в добрые старые времена страшноватых IBM/360 переводилось как "задание", но лучше это не тащить в сегодня) позволяет управлять множеством команд или работ одновременно. Прежде, чем вы закопаетесь значительно глубже, следует поговорить о процессах.

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

/home/larry# ps

PID TT STAT TIME COMMAND

24 3 S 0:03 (bash)

161 3 R 0:00 ps

/home/larry#

PID (Process IDentificator), перечисленные в первой колонке, это неповторяющиеся числа приписанные всем идущим процессам.

Последний столбец (COMMAND) дает имя выполняемой команды. Здесь мы видим только процессы, которые инициировал Larry. (В системе выполняется и много других процессов. Команда ``ps -aux'' может выдать перечень всех происходящих в данный момент процессов).

В выведенном перечне указаны bash (это оболочка, используемая Larry) и сама команда ps. Как вы видите, bash выполняется параллельно с командой ps. bash выполнит ps, когда Larry введет команду. После окончания ps (после того, как выдана таблица процессов), управление возвращается к процессу bash, который выдает на экран подсказок готовности к приему новых команд.

Выполняемый процесс известен shell как работа. Термины процесс и работа взаимозаменяемы. Однако процесс обычно воспринимается, как "работа", когда речь идет об управлении работами (job control)- свойстве shell, позволяющем уделять внимание нескольким независимым работам.

В большинстве случаев пользователи выполняют в каждый момент времени одну работу, ту которая соответствует последней переданной shell команде. Однако, используя управление работами, вы можете одновременно выполнять несколько работ, по необходимости переключаясь с одной на другую. Какая от этого польза? Давайте предположим, что вы редактируете текстовый файл и неожиданно хотите прерваться и сделать что-то другое. С помощью управления работами вы можете отложить редактирование и, вернувшись к подсказке shell, начать какую-то другую работу. После этого вы можете вернуться к редактированию, именно к тому месту, где вы прервали редактирование. Это всего один пример. Управление работами очень полезно на практике.




4.2 Выполнение работ на переднем плане и в фоне

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

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

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

Имейте в виду, что приостановка работы, это не прерывание работы. Когда вы прерываете идущий процесс (нажимая клавиши прерывания, обычно это ctrl-C), то убиваете процесс насовсем. (Клавиши прерывания можно переустанавливать командой stty. По умолчанию прерывание находится под ctrl-C, но мы не можем это гарантировать для всех систем). Если работа убита, то уж убита, и нет другого способа возобновить ее, как вновь запустить сначала, используя прежнюю команду. Заметим также, что некоторые программы могут перехватывать прерывания, тогда нажатие ctrl-C не приведет к немедленному прекращению работы. Это позволит программе выполнить необходимые операции аккуратного завершения. Некоторые программы вообще не позволят вам их прервать.




4.3 Работа в фоне и ликвидация работ

Давайте начнем с простого примера. Команда yes - вроде бы бесполезная команда, посылающая бесконечный поток "y" на стандартный выход. (Но это очень полезно. Если вы направите через конвейер эти "y" на вход другой команды, которая требует ответов yes и "no" на вопросы, поток "y" даст подтверждение на все вопросы). Попробуйте.

/home/larry# yes

y

y

y

y

y

Это закончится в бесконечности. Вы можете убить процесс, нажав клавиши прерывания; обычно это ctrl-C. Чтобы нас больше не раздражал поток нескончаемых "y", перенаправим его в /dev/null. Как вы помните, /dev/null выступает в качестве "черной дыры" для данных. В ней исчезают бесследно любые данные.

/home/larry# yes > /dev/null

Ох, теперь намного лучше. Ничего не печатается, но и подсказка shell не появляется. Это потому, что программа продолжает работать, посылать "y" в /dev/null. Снова нажмите клавиши прерывания, чтобы прекратить это.

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

Чтобы переместить процесс в фоновый режим, необходимо после команды символ ``&''.

/home/larry# yes > /dev/null &

[1] 164

/home/larry#

Вы видите, что мы вновь получили подсказку. Но что значит ``1 164''? И выполняется ли команда yes на самом деле?

``1'' представляет номер работы для программы yes. Shell приписывает номер каждой выполняемой работе. Поскольку "yes" - одна единственная работа, которая в данный момент выполняется, ей присвоен номер 1. ``164'' - идентификатор процесса (PID); это номер, присвоенный системой работе. Любой из этих номеров можно использовать при обращении к работе, как это будет показано в дальнейшем.

Теперь мы имеем выполняемый процесс yes в фоновом режиме, непрерывно посылающий поток "y"-ков в /dev/null. Чтобы проверить состояние этого процесса, используйте внутреннюю команду shell - jobs.

/home/larry# jobs

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

/home/larry#

Ясно, что она выполняется. Вы можете также воспользоваться командой ps, показанной ранее, для проверки статуса работ.

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

/home/larry# kill %1

мы ликвидируем работу. При идентификации работы по номеру необходимо впереди ставить символ процента (``%'').

Теперь, после ликвидации, мы можем снова использовать jobs для проверки:

/home/larry# jobs

[1]+ Terminated yes >/dev/null

/home/larry#

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

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

/home/larry# kill 164

эквивалентна

/home/larry# kill %1

Вам не надо использовать ``%'', когда вы обращаетесь к работе по номеру идентификатора процесса.




4.4 Остановка и возобновление работы

Есть другой способ перевести работу в фоновый режим. Вы можете начать работу нормально (в режиме переднего плана), остановить работу и продолжить в фоновом режиме.

Сначала начнем работу "нормально":

/home/larry# yes > /dev/null

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

Теперь, вместо того, чтобы прерывать работу с помощью ctrl-C, мы остановим работу. Приостановка работы не убивает ее. Чтобы осуществить приостановку работы, надо нажать соответствующие клавиши, обычно это ctrl-Z.

/home/larry# yes > /dev/null

[ctrl-Z]

[1]+ Stopped yes >/dev/null

/home/larry#

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

Для возобновления работы в режиме переднего плана используйте команду fg (``foreground'' - передний план).

/home/larry# fg

yes >/dev/null

Shell снова выдаст на экран имя команды, чтобы вы могли проконтролировать, какую работу вы активизировали в режиме переднего плана. Вновь остановите работу с помощью ctrl-Z. В этот раз используйте команду bg (``background'' - задний план, фоновый режим), чтобы перевести работу в фоновый режим. Эффект будет аналогичен тому, как если бы вы набрали после команды ``&''.

/home/larry# bg

[1]+ yes >/dev/null &

/home/larry#

И мы получили назад подсказку. Команда jobs сообщит, что команда yes действительно выполняется, и мы можем снова ее убить с помощью команды kill, как мы это уже делали.

Как теперь остановить работу? Использование ctrl-Z не поможет, поскольку работа находится в фоновом режиме. Ответ - переместить работу на передний план, а затем остановить. Вы можете использовать fg как для остановленных работ, так и для работ, находящихся в фоне.

Существует большая разница между фоновой работой и остановленной. Остановленная работа не выполняется и не использует время процессора, да и никакой работы, честно говоря, в этот момент не делает (но занимает память, хотя по воле своппинга может оказаться на диске). Работа в фоновом режиме и выполняется, и занимает память. Она может даже выводить что-то на экран, хотя это может раздражать вас, когда вы работаете над чем-то другим. Например, если вы использовали команду:

/home/larry# yes &

без перенаправления stdout в /dev/null, поток "y" будет выводиться на экран без возможности прервать это (вы не сможете использовать ctrl-C для прерывания работ фонового режима). Чтобы остановить эту бесконечную выдачу, вам следует использовать команду fg для перевода работы в режим переднего плана, а затем использовать ctrl-C, чтобы ее убить.

Еще одно замечание. Команды fg и bg обычно переводят на передний план или в фоновый режим работы, которые были остановлены последними (что определяется символом ``+'' после номера работы, это когда вы используете команду jobs). Если вы выполняете много работ одновременно, вы можете перевести на передний план или, наоборот, в фоновый режим конкретную работу заданием идентификатора работы в качестве аргумента команд fg или bg, как в

/home/larry# fg %2

(перевод на передний план работы номер 2) или

/home/larry# bg %3

(перевод в фон работы номер 3).

Для этих команд нельзя использовать идентификаторы процессов. Кроме того, использование только номеров работ, как в

/home/larry# %2

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

/home/larry# fg %2

Помните, что управление работами, это свойство shell. Команды fg, bg и jobs - внутренние команды shell. Если по какой-то причине вы используете shell, который не поддерживает управление работами, там вы не найдете этих команд.

В дополнение к этому, есть некоторые аспекты управления работами, которые различаются в Bash и Tcsh. Некоторые оболочки не имеют управления работами, хотя большинство оболочек Linux имеют такую возможность.