<< Предыдущий раздел | /\ Содержание | >> Следующий раздел

Фоновое исполнение задач

Часто бывает нужно запустить "долгоиграющую" программу, которая все равно пишет данные только в файл (например, какие-либо вычисления), или графическое приложение, которое не пользуется окном терминала. Но ведь пока программа запущена, терминал "принадлежит" ей, и им больше ни для чего нельзя пользоваться!

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

Пример (запустить графический калькулятор):

bobby:~% xcalc &       
[1] 2616
bobby:~% _

В квадратных скобках shell печатает номер задания, а за ним -- номер процесса (об этом подробнее в следующем разделе).

Таким образом можно запустить в фоновом режиме несколько задач -- например, калькулятор, текстовый редактор и "снежную зиму":

bobby:~% xedit &       
[2] 2628
bobby:~% xsnow &
[3] 2629
bobby:~% _

Посмотреть список запущенных задач можно командой "jobs":

bobby:~% jobs          
[1]    running    xcalc
[2]  - running    xedit
[3]  + running    xsnow
bobby:~% _

(Символы "+" и "-" означают "последняя запущенная задача" и "предпоследняя").

Если у программы не предусмотрено способа завершить исполнение, то ее можно "убить" командой "kill":

bobby:~% kill %3       
[3]  + done       xsnow
bobby:~% _

Символ процента и следующий за ним номер являются ссылкой на конкретное задание.


Если задача случайно запущена без символа "&", то ее можно или завершить комбинацией клавиш Ctrl+C и потом запустить правильно, или "заморозить", нажав Ctrl+Z, а потом перевести в фоновый режим командой "bg" (сокращение от BackGround):

bobby:~% xcalc         

zsh: suspended  xcalc
bobby:~% bg %1
[1]  + continued  xcalc
bobby:~% _

Бывает и обратное: случайно интерактивная программа (например, текстовый редактор) запущена в фоновом режиме. Интерактивные программы при этом автоматически "замораживаются" (потому, что они пытаются читать с терминала, который ей "не принадлежит"). Перевести их в "основной режим" можно командой "fg" (сокращение от ForeGround):

bobby:~% emacs -nw &
[1] 2637
bobby:~% 
[1]  + suspended (tty output)  emacs -nw  
bobby:~% fg %1
[1]  + continued  emacs -nw

Замечание
Если командам bg и fg не указывать задачу, то они работают с последней запущенной -- той, что помечена символом "+".


Если попробовать набрать "exit" для выхода из системы (или из окна терминала) при исполняющихся в фоновом режиме задачах, то zsh не позволит выйти:

bobby:~% xcalc &            
[1] 2691
bobby:~% exit
zsh: you have running jobs.
bobby:~% _
Повторная команда "exit" все же будет выполнена, но zsh постарается завершить фоновые задачи:

bobby:~% xcalc &            
[1] 2700
bobby:~% exit
zsh: you have running jobs.
bobby:~% exit
zsh: warning: 1 jobs SIGHUPed

Чтобы zsh не считал своей обязанностью "убитие" фоновых задач при выходе, можно заставить его забыть про них:

bobby:~% xcalc &            
[1] 2701
bobby:~% jobs
[1]  + running    xcalc
bobby:~% disown %1
bobby:~% jobs
bobby:~% _

Замечание
Другие оболочки (bash и tcsh) менее "заботливы", и завершают работу по первой же команде exit, оставляя фоновые задачи "беспризорными".

Чтобы запустить фоновую задачу и заставить zsh сразу же забыть про нее, надо набрать всю команду (включая "&") в круглых скобках:

bobby:~% (xcalc &)          
bobby:~% jobs
bobby:~% _


<< Предыдущий раздел | /\ Содержание | >> Следующий раздел