Фоновый режим в Linux. Как запустить программу без блокировки терминала?

фоновый режим в linux. как запустить программу без блокировки терминала?

Зачем нужен фоновый режим

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

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

Фоновый режим — это способ самостоятельного выполнения программы, не требующий вмешательства пользователя. Многие приложения, установленные вместе с операционной системой, начинают свою работу в фоновом режиме при старте системы. К таковым относятся: антивирусы, межсетевые экраны, графические оболочки и т. д.

Запуск программы в фоновом режиме

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

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

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

Если вам нужно перевести в фоновый режим уже работающую программу, нажмите сочетание клавиш Ctrl + Z. Это приостановит выполнение, покажет в терминале номер задания и приглашение к вводу новых команд. Подставьте полученный номер задания в качестве параметра команды bg, что переведет его в фон и автоматом запустит на выполнение. Также вы можете использовать следующую конструкцию «%[номер_задания] &». Она производит аналогичные действия.

bg номер_задания
%номер_задания &

Заметка
Согласно сложившейся терминологии и сленгу, программы Linux, выполняемые в фоновом режиме, называются заданиями (англ. Jobs). В интернете присутствует множество статей, где слово задание используется как синоним любой работающей программы. Это в корне не правильно.

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

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

find / -name .ini 2> ~/results.txt &
[1] 19090
fg 1
bash: fg: задача завершилась
[1]+ Выход из 1 find / -name .ini 2> ~/results.txt

Просмотр списка фоновых заданий

Если вы запустили несколько программ в фоне, может появиться потребность отслеживания их состояния. Для этого в Linux есть специальная команда jobs. Она выводит информацию обо всех заданиях, работающих в фоновом режиме, в следующем виде «[номер_задания] статус_задания команда_введенная_при_запуске». Получить идентификаторы процессов можно добавив опцию -l.

telnet yandex.ru 80 > /dev/null &
[1] 19424
telnet google.com 80 > /dev/null &
[2] 19425
jobs -l
[1]- 19424 Running telnet yandex.ru 80 > /dev/null &
[2]+ 19425 Running telnet google.com 80 > /dev/null &

Три основных статуса фоновых заданий:

  • Running — программа выполняется в настоящее время либо ожидает своей очереди. В общем, этот статус сигнализирует о нормальном выполнении фонового задания.
  • Sleeping — задание находится в состоянии ожидания какого-либо сигнала или освобождения определенного ресурса.
  • Zombie — выполнение данной фоновой задачи прекратилось, но она не высвободила те или иные ресурсы системы. Такой статус сигнализирует об ошибках выполнения и требует ручного уничтожения процесса.

Принудительное завершение заданий

Для завершения работы фоновой программы в Linux нужно использовать команду kill. Это может потребоваться, если задание выполняется слишком долго или оно имеет статус zombie. Команде kill необходимо передать идентификатор процесса, который можно увидеть с помощью jobs с указанием опции -l.

kill также принимает дополнительную опцию, указывающую на характер завершения фоновой задачи. Эта опция не имеет имени и записывается в виде числового значения. Такой вызов в общем виде записывается как «kill -характер_завершения идентификатор_процесса».

telnet google.com 80 > /dev/null &
[2] 19425
kill -9 19425

Часто используемые коды завершения:

  • 15 (SIGTERM) — попытка осуществить завершение работы так, как это произошло бы при нормальных условиях.
  • 9 (KILL) — принудительное завершение. Самый грубый метод. Гарантированно «убивает» процесс без возможности его корректного завершения.
  • 19 (SLEEP) — переводит процесс в статус Sleeping. Ожидает получения другого сигнала для возобновления работы.
  • 18 (CONT) — возобновляет выполнение фоновой задачи, ранее остановленной с помощью сигнала 19.

Последние публикации