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

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

ПрограммыFreeBSDMacOSterminalLinuxТрюки Bash

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

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

Файловые дескрипторы процессов в 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 &
Фото Малоизвестные, но полезные возможности утилиты less
Малоизвестные, но полезные возможности утилиты less

Команда less является одной из самых известных на ряду с cd, cp, mv и т.д. Но используется less зачастую далеко не на всю мощь.

Фото Моржовый оператор в Python3.8
Моржовый оператор в Python3.8

Вышла первая альфа версия Python 3.8 – самое время поглядеть, что нового добавили в язык!