Процессы и управление заданиями. Запустить процесс в фоне в Linux Фоновый процесс linux

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

Вы, наверное, заметили, что, после того, как вы ввели команду в 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 .

Как и любая другая многозадачная система, 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

  1. Вам нужно выполнить sql-запрос, результат которого нужно ждать несколько часов или дней?
  2. Вам нужно запустить приложение в фоне?
  3. Вам нужно выполнять программу в фоне и иметь возможность к ней вернуться?
  4. Вы используете линукс-консоль и работаете с ssh?

Тогда вам в обязательном порядке нужно знать о screen .

Основы screen

Screen в linux — это как "окна в Windows", которые можно свернуть/развернуть. Вы можете что то делать в одном окне, например смотреть фотографии. Но, если вам нужно кроме просмотра фотографий слушать музыку, то вы откроете новое окно (проводник), зайдёте в каталог с музыкой и отроете песню в аудио-программе.

Когда речь идёт о консоли линукс (особенно при работе по ssh ), то нам будет крайне не удобно в одной консоли выполнять различные приложения. А, может, и совсем не удастся выполнять вторую операцию в то время, когда первая ещё продолжает свою работу. Это первый момент. Второй момент заключается в том, что в случае какого-либо сбоя с вашей стороны (со стороны клиента) - текущая операция прервётся. Пара примеров, когда при работе с ssh может понадобиться screen :

  • если вы копируете или перемещаете большой объём файлов с одного каталога в другой
  • если вы выполняете тяжёлый sql-запрос
  • если нужно запустить приложение, которое "захватывает" консоль

Наверное, вам было бы очень грустно, когда из-за случайно-закрытого терминала или скачка напряжения прервался бы sql-запрос, который уже выполнялся более 10 часов. В случае же с screen, screen работает на сервере, инициатором запроса будет объект screen и запрос уже не оборвётся не при каких проблемах клиента. При обрыве связи процессы не останавливаются, а продолжают работать, и к ним можно вернуться в любой момент.

Работа со screen

Для создания screen и начала работы с ним напечатайте в командной строке:

где test1 - произвольное имя для объекта screen, вы можете назвать его для удобства как вам нравится.

При этом будет создан screen под именем test1 . Теперь вы можете запускать любые долгие операции. Например выполнять sql-запрос:

Mysql -u ... select * from ... update ...

Уже на этом этапе, если у вас пропадёт интернет, вы случайно закроете вкладку терминала, перезагрузится комьютер — вы не потеряете никаких данных и sql-запрос не прервётся.

Чтобы выйти из screen, нажмите следующие клавиши:

+ & — выйти из screen`а. Запрос продолжит свою работу. Все процессы, запущенные в скринах, продолжают выполняться.

Чтобы вернуться в ваш screen либо в любое другое окно screen, можно просмотреть все доступные screen:

screen -r — выбрать и активировать один из screen.

Когда сессия screen вам больше не нужна, чтобы полностью завершить сессию скрин, активируйте screen с помощью screen -r и нажмите внутри него + либо напечатайте exit .