Запуск процесса в фоне linux. Как выполнять команды Linux в фоновом режиме? Отправка сигналов скриптам

💖 Нравится? Поделись с друзьями ссылкой

Служба с терминалом Linux по умолчанию ведется в однозадачном режиме. Это означает, что любая запущенная бригада блокирует терминал до своего завершения. Такой подход не удобен при запуске программ, спрашивающих продолжительного времени выполнения. Данную проблему можно решить двумя способами: раскрыть дополнительное окно терминала и выполнить в нем другую команду или использовать фоновый режим. Все нынешние операционные системы, в том числе и Linux, являются многозадачными, что подразумевает под собой возможность синхронного выполнения множества программ.

Как запустить бригаду в фоновом режиме, чтобы сразу получить доступ к интерфейсу командной строки? Бригада, выполнение которой было запланировано принудительно, называется фоновым процессом. Фоновые процессы не показываются на экране. Например, HTTPD-сервер Apache работает в фоновом режиме для обслуживания веб-страниц. В низкоприоритетный режим можно поместить скрипт оболочки или любую команду. Задачу (например, бригаду или скрипт) можно перевести в фоновый режим, добавив символ «&» в конец командной строчки. Этот оператор переводит команду в фоновый режим и освобождает место в терминале. Бригада, выполняемая в фоновом режиме, называется заданием. Во время работы фоновой команды возможно выполнять любые другие команды. Синтаксис выглядит следующим образом:

command & script-name & /path/to/command arg1 arg2 & command-1 | command-2 arg1 & command-1 | command-2 -arg1 -arg2 >/path/to/output &

Для пуска программ в фоновом режиме, не блокирующем окно терминала, необходимо использовать специальный инструктор «&». Поставьте этот символ в самом конце строки после указания фамилии команды, опций и входящих параметров. В общем виде данную последовательность можно вписать как «имя_команды -опция входящий_параметр &».

ls ~/* > ~/test-file.txt &
18960

После нажатия кнопки Enter программа автоматически запустится в фоновом режиме. При этом терминал покажет строчку со следующим содержимым «[номер_задания] идентификатор_процесса», и выдаст приглашение к вводу новоиспеченной команды.

Найти команды, работающие в фоновом режиме в Linux

Выполните следующую бригаду:

Пример вывода данных:

Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt &
+ Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Где и идентификаторы поручений.

Чтобы отобразить идентификаторы процессов для идентификаторов заданий помимо стандартных приведений, передайте параметр -l:

Пример вывода данных:

7307 Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt &
+ 7324 Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &

Дабы отобразить только идентификаторы процессов, введите:

Пример вывода данных:

Кончить выполнение команд, работающих в фоновом режиме

Для принудительного или постепенного завершения процесса вытечет использовать команду kill. Синтаксис выглядит следующим образом:

kill PID
kill -15 PID
kill -9 PID
killall process-Name-Here
killall -15 process-Name-Here
killall -9 process-Name-Here

Возврат програмки в приоритетный режим в Linux

Linux позволяет не только запускать программы в фоновом режиме, но и по хотению возвращать к привычному выполнению. Для этого существует два инструмента: команда (Команда - группа лиц, объединённая общими мотивами, интересами ) fg и оператор %. Принцип их усилия предельно прост. fg требует указать номер задания в качестве параметра, а к % его нужно подставить сходу после оператора без пробелов.

find / -name .ini 2> ~/results.txt &
19090
fg 1
bash: fg: задача закончилась
+ Выход из 1 find / -name .ini 2> ~/results.txt

Администрирование сервера под управлением Linux довольно часто сопровождается множественными манипуляциями команд в окне терминала. Это привычная картина для тех, кто администрирует сервера на Linux, и в некоторых случаях удобно выполнять команды в фоновом режиме. Это вполне может быть использовано на практике, и стоит отметить причины, почему это может быть полезным:
— Когда терминал переполняется кучей сообщений, да и выполнять параллельно дополнительные действия не представляется возможным;
— Если вы закрываете терминал, то останавливается текущий процесс, с его дочерними процессами;
Данные проблемы решаются элементарно, говоря простым языком нам необходимо полностью отделить выполняемый процесс от управляющего терминала.

В данном посту мы рассмотрим полезную возможность Linux выполнения команд в фоновом режиме. Иными словами процесс запущенный вами будет выполняться отдельно от управляющего терминала.

Как запускать команды или процессы в фоновом режиме
Если ваш процесс запущен в окне терминала, то приостановить его можно с помощью команды Ctrl+Z , наверное, это многие знают, и подумают, и что с этого. И вот что интересное, приостановив, таким образом, процесс, мы можем продолжить его в фоновом режиме, для этого необходимо ввести команду

После ввода этой команды процесс будет продолжен, но уже в фоновом режиме. Чтобы просмотреть все процессы, выполняемые в фоновом режиме, вы можете ввести команду

Давайте просмотрим простой пример, как это можно применить. Предположим у нас есть , который нам необходимо распаковать, однако нам некогда ждать, и мы хотим работать параллельно.

Распаковка архива в фоновом режиме

$ tar -czf home.tar.gz .

Жмем Cntr+Z , затем вводим команды

$ bg $ jobs

Второй способ – это добавить символ & в конце команды, это сообщит системе, что нужно выполнять команду в фоновом режиме.

$ tar -czf home.tar.gz . & $ jobs

Подобный способ позволяет выполнять процессы в фоновом режиме, тем не менее, STDIN , STDOUT , STDERR всё ещё связаны с терминалом. Теперь давайте добьемся того, чтобы процесс выполнялся даже при закрытии терминала.

Выполнение процесса после закрытия окна терминала
Чтобы процесс продолжил работать даже после закрытия окна терминала, мы можем использовать команду disown . Она «отцепит» процесс от оболочки окна терминала, после чего будет выполняться даже после закрытия окна консоли.
Давайте рассмотрим пример использования стандартной команды rsync , попробуем выполнить ее в фоновом режиме, и отцепим процесс от терминала.

$ sudo rsync Templates/* /var/www/html/ & $ jobs $ disown -h %1 $ jobs

Вы так же можете использовать команду nohup , она позволит продолжить выполнение процесса даже когда пользователь выходит из оболочки системы.

$ nohup tar -czf iso.tar.gz Templates/* & $ jobs

Как отделить процесс от управляющего терминала Linux
Чтобы полностью отделить процесс от управляющего терминала, можно так же использовать команду, которая будет эффективной при использовании пользовательского графического интерфейса (GUI), к примеру, браузер Firefox.

$ firefox /dev/null &

В системе Linux (да и практически во всех Unix-системах) /dev/null представляет собой специальный файл устройства, которое так же называют «пустым устройством». Запись в него производиться успешно вне зависимости от объема записанной информации, чтение из него эквивалентно считыванию конца файла (EOF).

Как и любая другая многозадачная система, Linux одновременно выполняет несколько процессов. Вообще, не буду вводить Вас в заблуждение, потому что обычный однопроцессорный компьютер может выполнять только одну задачу в данный момент времени, по-этому Linux ставит процессы в очередь на выполнения.

Существует несколько основных команд для управлением процессами

  • ps - выводить список запущенных процессов
  • kill - отправляет сигнал на один или несколько процессов (в основном, чтобы "убить" их)
  • jobs - альтернативный путь для просмотра процессов запущенных Вами
  • bg - ставит выполнение процесса в фоновый режим
  • fg - выводит выполнение процесса из фонового режима

Хотя может показаться, что эти знания достаточно абстрактны, но они могут найти свое практическое применение даже для среднего пользователя, который использует графический интерфейс. Возможно Вы еще не знаете, что большинство графических программ (если не все) можно запустить при помощи командной строки. Для примера попробуем запустить браузер, думаю у большинства linux-оидов стоит или Google Chrome или FireFox

Enej@linux:/home/pub/www/vv$ google-chrome Created new window in existing browser session.

Можно указать URL, который Вы хотите открыть

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт Created new window in existing browser session.

У меня уже запущен Хром через графический интерфейс, по-этому браузер сообщает, что создается новое окно в существующей сессии и отдает управление командной строке. Или, например, если нужно открыть графический файловый менеджер с правами рута (пример будет работать для графической оболочки Gnome с установленным Nautilus)

Enej@linux:/home/pub/www/vv$ sudo nautilus /root/ password for enej:

Поскольку процесс был запущен не в фоновом режиме, то в этом окне терминала Вы больше не можете выполнять какие-либо действия (чтобы завершить процесс можно нажать CTRL + C).

Фоновый режим

Для того, чтобы было проще жить, при запуске графических программ или процессов, которые могут долго работать, обычно их выполнение ставят в фоновый режим, например, давайте запустим браузер в фоновом режиме

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт & 9248

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

Но вдруг Вы забыли поставить ампресант в конце вызова, тогда существует другой способ. Нужно сначала остановить выполнение нажав CTRL + Z, тогда получаем управление командной строкой и можем вызвать команду bg , которая поставим последний запущенный процесс в фоновый режим. Сказанное на примере

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт ^Z + Stopped google-chrome http://сайт enej@linux:/home/pub/www/vv$ bg + google-chrome http://сайт &

Команда fg выводит последний запущенный процесс из фонового режима.

Список запущенных процессов

Поскольку теперь Вы умеете ставить команды в фоновый режим, было хорошо посмотреть их список. Для этого используется команда jobs или более мощная ps

Enej@linux:/home/pub/www/vv$ jobs - Running nm-applet & (wd: ~/bin) + Running google-chrome http://сайт & enej@linux:/home/pub/www/vv$ ps PID TTY TIME CMD 2304 pts/0 00:00:02 bash 11104 pts/0 00:00:01 chrome 11108 pts/0 00:00:00 chrome 11110 pts/0 00:00:00 chrome 11132 pts/0 00:00:00 chrome 12088 pts/0 00:00:00 ps 21165 pts/0 00:00:27 nm-applet

Как "убить" процесс?

Если процесс перестает отвечать на действия (т.е. завис), его нужно принудительно "убить". Думаю те кто использует FireFox сталкивались с этим. Для таких задач используется команда kill . Но для начала нужно каким-то образом определить процесс. Для этого можно использовать команду jobs или ps . С помощью первой можно узнать номер процесса, с помощью второй его идентификатор.

Enej@linux:/home/pub/www/vv$ google-chrome http://freaksidea..com & 15181 enej@linux:/home/pub/www/vv$ ps PID TTY TIME CMD 2304 pts/0 00:00:02 bash 15181 pts/0 00:00:00 chrome 15238 pts/0 00:00:00 ps 21165 pts/0 00:00:27 nm-applet enej@linux:/home/pub/www/vv$ kill 15181

Команды fg и bg в качестве первого аргумента могут принимать номер запущеного процесса, для его последуещего ввода/вывода в/из фонового режима.

Побробнее о kill

На самом деле команда kill используется для отправки разных сигналов процессам. Просто в большинстве случаев этот сигнал говорит команде, что она должна завершится. Если программы правильно написаны, то они прослушивают различные сигналы от операционной системы и отвечают на них. Например, текстовый редактор должен прослушивать любой сигнал, который уведомляет, что пользователей выходит из системы или что компьютер выключается. Когда он (текстовый редактор) "услышал" такой сигнал, он должен сохранить открытые документы перед тем как закончить свою работу. Команда kill умеет отсылать несколько типов сигналов, чтобы узнать какие, введите kill -l . Ниже приведен список самых часто используемых сигналов (число в скобках - номер сигнала)

  • SIGNUP(1) - изначально был предназначен для того, чтобы информировать программу о потере связи с управляющим терминалом (терминалы часто подключались к системе с помощью модемов, так что название сигнала происходит от hung up – повесить трубку). Сигнал SIGHUP посылается приложению так же и в том случае, если процесс-лидер сессии завершил свою работу. Многие программы-демоны , у которых нет лидера сессии, так же обрабатывают этот сигнал. В ответ на получение SIGHUP демон обычно перезапускается (или просто повторно читает файл конфигурации). По умолчанию программа, получившая этот сигнал, завершается.
  • SIGINT(2) - обычно посылается процессу, если пользователь терминала дал команду прервать процесс (обычно эта команда - сочетание клавиш Ctrl + C)
  • SIGTERM(15) - вызывает "вежливое" завершение программы. Получив этот сигнал, программа может выполнить необходимые перед завершением операции (например, сохранить открытые документы). Получение SIGTERM свидетельствует не об ошибке в программе, а о желании ОС или пользователя завершить ее.
  • SIGKILL(9) - вызывает принудительное завершение работы программы. Программа не может ни обработать, ни игнорировать этот сигнал.

По умолчанию команда kill отправляет SIGTERM сигнал, но также можно указать номер сигнала или его имя. Допустим, что у Вас завис Chrome (у меня иногда флэш плеер перестает адекватно работать)

Enej@linux:/home/pub/www/vv$ google-chrome http://сайт & 22066 enej@linux:/home/pub/www/vv$ jobs - Running nm-applet & (wd: ~/bin) + Running google-chrome http://сайт & enej@linux:/home/pub/www/vv$ kill -SIGTERM %2 enej@linux:/home/pub/www/vv$ kill -SIGKILL %2 enej@linux:/home/pub/www/vv$ kill -9 %2

P.S. : думаю очень интересным для начинающих будет 2 команды: notify-send (отправляет сообщение через графическую оболочку, в Gnome появляется вверху справа) и espeak (синтезатор речи). Если какой-то из них у Вас нет, установить можно при помощи команды apt-get

Enej@linux:/home/pub/www/vv$ sudo apt-get install espeak notify-send

Задания и процессы

Всякая выполняющаяся в Linux программа называется процессом . Linux как многозадачная система характеризуется тем, что одновременно может выполняться множество процессов, принадлежащих одному или нескольким пользователям. Вывести список исполняющихся в текущее время процессов можно командой ps , например, следующим образом:

/home/larry# ps PID TT STAT TIME COMMAND 24 3 S 0:03 (bash) 161 3 R 0:00 ps /home/larry#

Обратите внимание, что по умолчанию команда ps выводит список только тех процессов, которые принадлежат запустившему её пользователю. Чтобы посмотреть все исполняющиеся в системе процессы, нужно подать команду ps -a . Номера процессов (process ID, или PID ), указанные в первой колонке, являются уникальными номерами, которые система присваивает каждому работающему процессу. Последняя колонка, озаглавленная COMMAND, указывает имя работающей команды. В данном случае в списке указаны процессы, которые запустил сам пользователь larry . В системе работает ещё много других процессов, их полный список можно просмотреть командой ps -aux . Однако среди команд, запущенных пользователем larry , есть только bash (командная оболочка для пользователя larry) и сама команда ps . Видно, что оболочка bash работает одновременно с командой ps . Когда пользователь ввёл команду ps , оболочка bash начала её исполнять. После того, как команда ps закончила свою работу (таблица процессов выведена на экран), управление возвращается процессу bash . Тогда оболочка bash выводит на экран приглашение и ждёт новой команды.

Работающий процесс также называют заданием (job). Понятия процесс и задание являются взаимозаменяемыми. Однако, обычно процесс называют заданием, когда имеют ввиду управление заданием (job control). Управление заданием - это функция командной оболочки, которая предоставляет пользователю возможность переключаться между несколькими заданиями.

В большинстве случаев пользователи запускают только одно задание - это будет та команда, которую они ввели последней в командной оболочке. Однако многие командные оболочки (включая bash и tcsh ) имеют функции управления заданиями (job control), позволяющие запускать одновременно несколько команд или заданий (jobs) и, по мере надобности, переключаться между ними.

Управление заданиями может быть полезно, если, например, вы редактируете большой текстовый файл и хотите временно прервать редактирование, чтобы сделать какую-нибудь другую операцию. С помощью функций управления заданиями можно временно покинуть редактор, вернуться к приглашению командной оболочки и выполнить какие-либо другие действия. Когда они будут сделаны, можно вернуться обратно к работе с редактором и обнаружить его в том же состоянии, в котором он был покинут. У функций управления заданиями есть ещё много полезных применений.

Передний план и фоновый режим

Задания могут быть либо на переднем плане (foreground), либо фоновыми (background). На переднем плане в любой момент времени может быть только одно задание. Задание на переднем плане - это то задание, с которым вы взаимодействуете; оно получает ввод с клавиатуры и посылает вывод на экран (если, разумеется, вы не перенаправили ввод или вывод куда-либо ещё). Напротив, фоновые задания не получают ввода с терминала; как правило, такие задания не нуждаются во взаимодействии с пользователем.

Некоторые задания исполняются очень долго, и во время их работы не происходит ничего интересного. Пример таких заданий - компилирование программ, а также сжатие больших файлов. Нет никаких причин смотреть на экран и ждать, когда эти задания выполнятся. Такие задания следует запускать в фоновом режиме. В это время вы можете работать с другими программами.

Для управления выполнением процессов в Linux предусмотрен механизм передачи сигналов . Сигнал - это способность процессов обмениваться стандартными короткими сообщениями непосредственно с помощью системы. Сообщение-сигнал не содержит никакой информации, кроме номера сигнала (для удобства вместо номера можно использовать предопределённое системой имя). Для того, чтобы передать сигнал, процессу достаточно задействовать системный вызов kill() , а для того, чтобы принять сигнал, не нужно ничего. Если процессу нужно как-то по-особенному реагировать на сигнал, он может зарегистрировать обработчик , а если обработчика нет, за него отреагирует система. Как правило, это приводит к немедленному завершению процесса, получившего сигнал. Обработчик сигнала запускается асинхронно , немедленно после получения сигнала, что бы процесс в это время ни делал.

Два сигнала - номер 9 (KILL ) и 19 (STOP ) - всегда обрабатывает система. Первый из них нужен для того, чтобы убить процесс наверняка (отсюда и название). Сигнал STOP приостанавливает процесс: в таком состоянии процесс не удаляется из таблицы процессов, но и не выполняется до тех пор, пока не получит сигнал 18 (CONT ) - после чего продолжит работу. В командной оболочке Linux сигнал STOP можно передать активному процессу с помощью управляющей последовательности Ctrl -Z .

Сигнал номер 15 (TERM ) служит для прерывания работы задания. При прерывании (interrupt) задания процесс погибает. Прерывание заданий обычно осуществляется управляющей последовательностью Ctrl -C . Восстановить прерванное задание никаким образом невозможно. Следует также знать, что некоторые программы перехватывают сигнал TERM (при помощи обработчика), так что нажатие комбинации клавиш Ctrl -C (о) может не прервать процесс немедленно. Это сделано для того, чтобы программа могла уничтожить следы своей работы прежде, чем она будет завершена. На практике, некоторые программы вообще нельзя прервать таким способом.

Перевод в фоновый режим и уничтожение заданий

Начнём с простого примера. Рассмотрим команду yes, которая на первый взгляд может показаться бесполезной. Эта команда посылает бесконечный поток строк, состоящих из символа y на стандартный вывод. Посмотрим, как работает эта команда:

/home/larry# yes y y y y y

Последовательность таких строк будет бесконечно продолжаться. Уничтожить этот процесс можно, отправив ему сигнал прерывания, т. е. нажав Ctrl -C . Поступим теперь иначе. Чтобы на экран не выводилась эта бесконечная последовательность перенаправим стандартный вывод команды yes на /dev/null . Как вы, возможно, знаете, устройство /dev/null действует как «чёрная дыра »: все данные, посланные в это устройство, пропадают. С помощью этого устройства очень удобно избавляться от слишком обильного вывода некоторых программ.

/home/larry# yes > /dev/null

Теперь на экран ничего не выводится. Однако и приглашение командной оболочки также не возвращается. Это происходит потому, что команда yes все ещё работает и посылает свои сообщения, состоящие из букв y на /dev/null . Уничтожить это задание также можно, отправив ему сигнал прерывания.

Допустим теперь, что вы хотите, чтобы команда yes продолжала работать, но при этом и приглашение командной оболочки должно вернуться на экран, так чтобы вы могли работать с другими программами. Для этого можно команду yes перевести в фоновый режим, и она будет там работать, не общаясь с вами.

Один способ перевести процесс в фоновый режим - приписать символ & к концу команды. Пример:

/home/larry# yes > /dev/null & + 164 /home/larry#

Сообщение представляет собой номер задания (job number) для процесса yes. Командная оболочка присваивает номер задания каждому исполняемому заданию. Поскольку yes является единственным исполняемым заданием, ему присваивается номер 1. Число 164 является идентификационным номером, соответствующим данному процессу (PID ), и этот номер также дан процессу системой. Как мы увидим дальше, к процессу можно обращаться, указывая оба этих номера.

Итак, теперь у нас есть процесс команды yes, работающий в фоне, и непрерывно посылающий поток из букв y на устройство /dev/null . Для того, чтобы узнать статус этого процесса, нужно исполнить команду jobs , которая является внутренней командой оболочки.

/home/larry# jobs + Running yes >/dev/null & /home/larry#

Мы видим, что эта программа действительно работает. Для того, чтобы узнать статус задания, можно также воспользоваться командой ps , как это было показано выше.

Для того, чтобы передать процессу сигнал (чаще всего возникает потребность прервать работу задания) используется утилита kill . В качестве аргумента этой команде даётся либо номер задания, либо PID . Необязательный параметр - номер сигнала, который нужно отправить процессу. По умолчанию отправляется сигнал TERM . В рассмотренном выше случае номер задания был 1, так что команда kill %1 прервёт работу задания. Когда к заданию обращаются по его номеру (а не PID ), тогда перед этим номером в командной строке нужно поставить символ процента («% »).

Теперь введём команду jobs снова, чтобы проверить результат предыдущего действия:

/home/larry# jobs Terminated yes >/dev/null

Фактически задание уничтожено, и при вводе команды jobs следующий раз на экране о нем не будет никакой информации.

Уничтожить задание можно также, используя идентификационный номер процесса (PID ). Этот номер, наряду с идентификационным номером задания, указывается во время старта задания. В нашем примере значение PID было 164, так что команда kill 164 была бы эквивалентна команде kill %1 . При использовании PID в качестве аргумента команды kill вводить символ «% » не требуется.

Приостановка и продолжение работы заданий

Запустим сначала процесс командой yes на переднем плане, как это делалось раньше:

/home/larry# yes > /dev/null

Как и ранее, поскольку процесс работает на переднем плане, приглашение командной оболочки на экран не возвращается.

Теперь вместо того, чтобы прервать задание комбинацией клавиш Ctrl -C , задание можно приостановить (suspend, буквально - подвесить), отправив ему сигнал STOP . Для приостановки задания надо нажать соответствующую комбинацию клавиш, обычно это Ctrl -Z .

/home/larry# yes > /dev/null Ctrl -Z + Stopped yes >/dev/null /home/larry#

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

Для возобновления выполнения задания на переднем плане можно использовать команду fg (от слова foreground - передний план).

/home/larry# fg yes >/dev/null

Командная оболочка ещё раз выведет на экран название команды, так что пользователь будет знать, какое именно задание он в данный момент запустил на переднем плане. Приостановим это задание ещё раз нажатием клавиш Ctrl -Z , но в этот раз запустим его в фоновый режим командой bg (от слова background - фон). Это приведёт к тому, что данный процесс будет работать так, как если бы при его запуске использовалась команда с символом & в конце (как это делалось в предыдущем разделе):

/home/larry# bg + 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). Например, команда fg %2 помещает задание номер 2 на передний план, а команда bg %3 помещает задание номер 3 в фоновый режим. Использовать PID в качестве аргументов команд fg и bg нельзя.

Более того, для перевода задания на передний план можно просто указать его номер. Так, команда %2 будет эквивалентна команде fg %2 .

Важно помнить, что функция управления заданием принадлежит оболочке. Команды fg , bg и jobs являются внутренними командами оболочки. Если, по некоторой причине, вы используете командную оболочку, которая не поддерживает функции управления заданиями, то вы в ней этих (и подобных) команд не отыщете.

Запуск и обработка фоновых процессов: управление заданиями

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

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

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

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

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

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

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

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

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

Таким способом вы можете запустить несколько заданий: каждой команде при этом будет присвоен номер задания. Команда shell "а jobs выводит список всех заданий, связанных с текущим shell "ом. Перед заданием ставится знак + , отмечающий последний процесс, запущенный в фоновом режиме. Для восстановления конкретного задания в приоритетный режим вы можете ввести команду fg , где - номер задания, например, fg 5 .

Рассказать друзьям