Запуск и Обработка Фоновых Процессов: Контроль Заданий

Вы возможно заметили, что когда вы вводите команду из Terminal, вам обычно приходится ждать пока команда не закончит свою работу и shell не отдаст вам контроль. Это означает, что вы послали команду в foreground (приоритетный режим). Однако, бывают случаи когда это нежелательно.

Представьте, например, что вы решили скопировать огромный каталог в другой рекурсивно. Также вы решили игнорировать ошибки и перенаправили канал ошибок в /dev/null:

cp -R images/ /shared/ 2>/dev/null

Такая команда может выполняться несколько минут до полного завершения. У вас есть два решения: первое решение силовое - остановить (убить) команду и запустить это потом, когда у вас появится время подождать. Чтобы это сделать, нажмите Ctrl+c: это прервет процесс и вернет вас в командную строку. Но стоп, не делайте этого! Читайте дальше.

Допустим вы хотели бы, чтобы команда работала в то время, пока вы делаете что-либо другое. Решением является послать процесс в background (фоновый режим). Чтобы это сделать, наберите Ctrl+z чтобы приостановить процесс:

$ cp -R images/ /shared/ 2>/dev/null
  # Наберите C-z здесь
[1]+  Stopped                 cp -R images/ /shared/ 2>/dev/null
$

и вот вы опять в командной строке. Процесс теперь находится в ожидании, когда вы снова его перезапустите (это видно по ключевому слову Stopped). Что, конечно, есть то, что вы хотите сделать, но теперь в фоновом режиме (background). Наберите bg (BackGround), чтобы получить желаемый результат:

$ bg
[1]+ cp -R images/ /shared/ 2>/dev/null &
$

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

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

cp -R images/ /shared/ 2>/dev/null &

Если вам нужно, вы можете восстановить этот процесс в приоритетный режим и подождать его окончания, написав fg (ForeGround). Чтобы вернуть его снова в фоновый режим, наберите последовательность Ctrl+z, bg.

Вы можете запустить несколько заданий таким образом: тогда каждой команде будет присвоен номер задания. Команда shell jobs выводит список всех заданий, связанных с текущей shell. Знак + перед заданием указывает на последний процесс, запущенный как фоновая задача. Чтобы частично восстановить задание в приоритетном режиме, вы можете написать fg <n>, где <n> номер задания, то есть fg 5.

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