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


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

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

/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 имеют такую возможность.



Содержание раздела