Программы
Как запустить программу в терминале в фоне, без вывода какого либо текста

Как запустить программу в терминале в фоне, без вывода какого либо текста

Запускаем программу в терминале в фоновом режиме и разбираемся, как и почему это работает в Linux / Unix терминале.

Для начала оговорюсь, что "отключать" вывод программы может быть вредно. Так например, если программа внезапно завершилась, её "предсмертные" слова могут помочь нам понять причину завершения.

Но хотим – значит делаем! Для начала разберёмся, как же программа выводит текст в консоль.

Изображение Выучи 10 хороших привычек для работы в UNIX от IBM

Файловые дескрипторы процессов в Unix-подобных системах

Каждая программа, которая запускается на Unix-подобной операционной системе имеет набор файловых дескрипторов (описателей). Дескрипторы используются для взаимодействия с потоками ввода / вывода, файлами, сокетами сети. В процессе жизнедеятельности программа может открывать новые дескрипторы и закрывать / освобождать старые.

Обычно при старте операционной системой выделяется 3 дескриптора:

  1. для стандартного ввода (stdin) – используется для получения информации от пользователя в терминале / программ, и которых пайпом перенаправили вывод;
  2. для стандартного потока вывода (stdout) – печать на терминал,
  3. для потока вывода ошибок (stderr) – печать ошибок и предупреждений (также по умолчанию на терминал)

– имеющие номера 0, 1 и 2 – соответственно.

Перенаправление потоков ввода / вывода

Стандартный поток вывода отнюдь не обязан выводить результат в терминал. К примеру, мы можем его перенаправить в файл, например:

some_program > ./file.txt

Однако, под каждую программу создавать файл, который к тому же будет занимать какое ни какое дисковое пространство – расточительно. Для этой задачи вполне сойдёт стандартный для Unix-like систем псевдо-файл /dev/null. В него можно записать всё что угодно, но нельзя ничего прочитать – этакая персональная чёрная дыра.

some_program 1> /dev/null

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

Теперь нам нужно перенаправить стандартный поток ошибок. Сделаем мы это через перенаправление его в 1-ый (stdout), который уже перенаправлен в /dev/null:

some_program 2>&1 1> /dev/null

Если мы хотим перенаправить вывод из одного дескриптора в другой – перед номером принимающего дескриптора необходимо поставить &. Иначе – запишем в файл "1".

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

Также символ & нам понадобится для запуска программы в фоне. Например, давайте запустим простую, но долгую программу в фоне, выполним другую программу, а потом вернём из фона первую программу.

$ sleep 100 &
[1] 4925
$ echo "Hello"
Hello
$ jobs
[1]+  Running                 sleep 100 &
$ fg 1
sleep 100
^C

С помощью команды jobs можно получить список запущенных в сессии терминала задач. Задачи пронумерованы – по этим номерам можно поднимать задачи из фонового режима командой fg.

Таким образом, нашу программу мы можем "запустить в терминале в фоне, без вывода какого либо текста" следующим способом:

some_program 2>&1 > /dev/null &