Запустим сначала процесс командой yes на переднем плане, как это делалось раньше:
/home/larry# yes > /dev/nullКак и ранее, поскольку процесс работает на переднем плане, приглашение командной оболочки на экран не возвращается.
Теперь вместо того, чтобы прервать задание комбинацией клавиш Ctrl-C, задание можно приостановить (suspend, буквально -- "подвесить"). "Подвешенное" задание не будет уничтожено; его выполнение будет временно остановлено до тех пор, пока оно не будут возобновлено. Для приостановки задания надо нажать соответствующую комбинацию клавиш, обычно это Ctrl-Z.
/home/larry# yes > /dev/null {ctrl-Z} [1]+ Stopped yes >/dev/null /home/larry#Приостановленный процесс попросту не выполняется. На него не тратятся вычислительные ресурсы процессора. Приостановленное задание можно запустить выполняться с той же точки, как будто бы оно и не было приостановлено.
Для возобновления выполнения задания на переднем плане можно использовать команду fg (от слова "foreground" -- передний план).
/home/larry# fg yes >/dev/nullКомандная оболочка еще раз выведет на экран название команды, так что пользователь будет знать, какое именно задание он в данный момент запустил на переднем плане. Приостановим это задание еще раз нажатием клавиш Ctrl-Z, но в этот раз запустим его в фоновый режим командой bg (от слова "background" -- фон). Это приведет к тому, что данный процесс будет работать так, как если бы при его запуске использовалась команда с символом "&" в конце (как это делалось в предыдущем разделе):
/home/larry# bg [1]+ yes $>$/dev/null & /home/larry#При этом приглашение командной оболочки возвращается. Сейчас команда jobs должна показывать, что процесс yes действительно в данный момент работает; этот процесс можно уничтожить командой kill, как это делалось раньше.
Для того, чтобы приостановить задание, работающее в фоновом режиме, нельзя пользоваться комбинацией клавиш Ctrl-Z. Прежде, чем приостанавливать задание, его нужно перевести на передний план командой fg и лишь потом приостановить. Таким образом, команду fg можно применять либо к приостановленным заданиям, либо к заданию, работающему в фоновом режиме.
Между заданиями в фоновом режиме и приостановленными заданиями есть большая разница. Приостановленное задание не работает -- на него не тратятся вычислительные мощности процессора. Это задание не выполняет никаких действий. Приостановленное задание занимает некоторый объем оперативной памяти компьютера, хотя оно может быть перенесено в своп. Напротив, задание в фоновом режиме выполняется, использует память и совершает некоторые действия, которые, возможно, вам требуются, но вы в это время можете работать с другими программами.
Задания, работающие в фоновом режиме, могут пытаться выводить некоторый текст на экран. Это будет мешать работать над другими задачами. Например, если ввести команду
/home/larry# yes &(стандартный вывод не был перенаправлен на устройство /dev/null), то на экран будет выводится бесконечный поток символов y. Этот поток невозможно будет остановить, поскольку комбинация клавиш Ctrl-C не воздействует на задания в фоновом режиме. Для того, чтобы остановить эту выдачу, надо использовать команду fg, которая переведет задание на передний план, а затем уничтожить задание комбинацией клавиш Ctrl-C.
Сделаем еще одно замечание. Обычно командой fg и командой bg воздействуют на те задания, которые были приостановлены последними (эти задания будут помечены символом "+" рядом с номером задания, если ввести команду jobs). Если в одно и то же время работает одно или несколько заданий, задания можно помещать на передний план или в фоновый режим, задавая в качестве аргументов команды fg или команды bg их идентификационный номер (job ID). Например, команда
/home/larry# fg %2помещает задание номер 2 на передний план, а команда
/home/larry# bg %3помещает задание номер 3 в фоновый режим. Использовать PID в качестве аргументов команд fg и bg нельзя.
Более того, для перевода задания на передний план можно просто указать его номер. Так команда
/home/larry# %2будет эквивалентна команде
/home/larry# fg %2Важно помнить, что функция управления заданием принадлежит оболочке. Команды fg, bg и jobs являются внутренними командами оболочки. Если, по некоторой причине, вы используете командную оболочку, которая не поддерживает функции управления заданиями, то вы в ней этих (и подобных) команд не отыщете.
Кроме этого, имеются еще некоторые различия в том, как осуществляется управление заданиями в оболочках bash и tcsh. В действительности некоторые оболочки вообще не имеют функций управления заданиями (хотя большинство оболочек в системе Linux такие функции имеет).