Linux и UNIX: программирование в shell. Руководство разработчика. - страница 17
>$ at -l
>
1. >1999-05-05 23:00 а
>
2. >1999-05-06 06:00 а
>
3. >1999-05-21 11:20 а
>$ atrm 3
>$ at -l
>2 1999-05-05 23:00 а
>4 1999-05-21 11:20 а
3.3. Оператор &
При выполнении задания в экранном режиме происходит "захват" терминала на весь этот период. Перевод задания в фоновый режим позволяет освободить терминал для других целей. Чтобы выполнить команду в фоновом режиме, укажите после нее оператор &:
>команда &
В таком режиме удобно выполнять команду find, посылать задания на принтер, сортировать записи больших списков с помощью Команды sort и т. д. Не переводите в фоновый режим те команды, которые требуют ввода информации пользователем, поскольку в этом случае работа команды будет приостановлена, а вы не узнаете об этом.
Недостаток выполнения команды в фоновом режиме заключается в том, что весь ее вывод по–прежнему направляется на терминал. По этой причине выходные потоки таких команд часто перенаправляют в файл с помощью следующей конструкции:
>команда > выходной файл 2>&1 &
Данная конструкция задает переадресацию стандартных потоков вывода и ошибок в указанный файл.
При запуске задания в фоновом режиме на экране отображается номер соответствующего процесса. Впоследствии этот номер можно использовать как для уничтожения процесса с помощью команды kill, так и для перевода задания в экранный режим посредством команды fg.
3.3.1. Запуск команды в фоновом режиме
Выполним в фоновом режиме команду find, которая ищет в каталоге /etc файл srm.conf, и перенаправим ее вывод в файл find .dt
>$ find /etc -name "srm.conf" — print > find .dt 2>&1 &
>[1] 27015
Номер процесса в данном случае равен 27015. После завершения выполнения задания, когда вы в очередной раз нажмете клавишу [Return], на экране отобразится такое сообщение:
>[1]+ Done find /etc "srm.conf" — print
3.3.2. Получение списка выполняющихся процессов с помощью команды ps
Предположим, имеется сценарий psl, который выполняется довольно долго: $ p$1 &
>[2] 28305
Узнать о состоянии этого задания можно с помощью команды ps, которая по умолчанию выводит список всех запущенных в данный момент процессов, принадлежащих текущему пользователю:
>$ ps | |||
>PID | >TTY | >TIME | >CMD |
>679 | >pts/0 | >00:00:01 | >bash |
>28305 | >pts/0 | >00:02:07 | >psl |
>28310 | >pts/0 | >00:00:00 | >ps |
Здесь в четырех столбцах приведена следующая информация: первый — идентификатор процесса, второй — идентификатор терминала, с которого он запущен, третий -cуммарное время использования процессора, четвертый — выполняемая команда.
Если процессов слишком много, воспользуйтесь командой grep, указав в ней номер нужного задания:
>$ ps | grep 28305
>28305 pts/0 00:02:20 psl
Обратите внимание: команда ps не показывает, в каком режиме выполняется задание — в фоновом или экранном.
3.3.3. Уничтожение фонового задания
Сигнал о завершении посылается процессу командой kill:
>kill [-сигнал] номер_процесса
Далее в этой книге мы рассмотрим, какие существуют сигналы. Пока же достаточно знать, что по умолчанию команда kill посылает сигнал номер 1 — HUP (hang‑up -oтбой). На экран выводится сообщение о прекращении задания:
>$ kill 28305
>[1]+ Terminated ./psl
Многие команды и сценарии перехватывают сигнал HUP, поэтому команда kill -1 не уничтожает их. В этом случае нужно воспользоваться командой kill -9, которая посылает процессу сигнал KILL (уничтожить). Этот сигнал не перехватывается и означает безусловное уничтожение процесса.
>$ kill -9 28305
>[1] + Killed ./psl
3.4. Команда nohup
Задание, выполняющееся в фоновом режиме, уничтожается, когда запустивший его пользователь выходит из системы. Вы можете обеспечить, чтобы после завершения сеанса работы в системе продолжилось автономное выполнение вашего задания. Для этого запустите его с помощью команды nohup. Общий формат этой команды таков:
nohup команда &
3.4.1. Запуск задания с помощью команды nohup
По умолчанию все выходные данные задания, запушенного с помощью команды nohup, направляются в файл nohup.out, но можно указать другой файл;
>nohup команда > выходной файл 2>&1 &
'Давайте проверим работу команды nohup на примере упомянутого выше сценария psl.
>$ nohup psl &
>[1] 179
nohup; appending output to 'nohup.out'