Как правило, выполнение команд в терминале связано с одним неудобством — прежде чем приступить к вводу следующей команды, следует дождаться выполнения предыдущей. Это происходит, поскольку текущий процесс блокирует доступ к оболочке операционной системы и в таких случаях говорят, что команда выполняется на переднем плане. Что же делать, если нужно запустить несколько команд одновременно? Есть несколько решений. Первое и наиболее очевидное — открыть дополнительное окно терминала. Второе — инициировать выполнение команды в фоновом режиме.
Если какой-либо процесс происходит в фоновом режиме, это значит, что он не предусматривает взаимодействия с пользователем, следовательно, доступ к оболочке остается свободным. Прочитав эту статью, вы узнаете как запустить процесс в фоне Linux и что делать, чтобы их выполнение не прерывалось после закрытия терминала.
Содержание статьи
- Как запустить процесс в фоне Linux
- Как перевести процесс в фоновый режим
- Работа процессов в фоне
- Выводы
Как запустить процесс в фоне Linux
Для выполнения команды в фоновом режиме достаточно добавить в конце символ амперсанда (&):
command &
В выводе терминала будут отображены порядковый номер задачи (в квадратных скобках) и идентификатор процесса:

В фоновом режиме можно одновременно запускать сразу два, три, четыре процесса и даже больше.
Работая в фоновом режиме, команда все равно продолжает выводить сообщения в терминал, из которого была запущена. Для этого она использует потоки stdout и stderr, которые можно закрыть при помощи следующего синтаксиса:
command > /dev/null 2>&1 &
Здесь >/dev/null 2>&1 обозначает, что stdout будет перенаправлен на /dev/null, а stderr — к stdout.

Узнать состояние всех остановленных и выполняемых в фоновом режиме задач в рамках текущей сессии терминала можно при помощи утилиты jobs c использованием опции -l:
jobs -l
Вывод содержит порядковый номер задачи, идентификатор фонового процесса, состояние задачи и название команды, которая запустила задание.

В любое время можно вернуть процесс из фонового режима на передний план. Для этого служит команда fg:
fg
Если в фоновом режиме выполняется несколько программ, следует также указывать номер. Например:
fg %1

Для завершения фонового процесса применяют команду kill с номером программы:
kill %1

Как перевести процесс в фоновый режим
Если изначально процесс был запущен обычным способом, его можно перевести в фоновый режим, выполнив следующие действия:
- Остановить выполнение команды, нажав комбинацию клавиш Ctrl+Z.
- Перевести процесс в фоновый режим при помощи команды bg.
bg

Работа процессов в фоне
Запуск скрипта в фоне linux - это одно, но надо чтобы он ещё работал после закрытия терминала. Закрытие терминала путем нажатия на крестик в верхнем углу экрана влечет за собой завершение всех фоновых процессов. Впрочем, есть несколько способов сохранить их после того как связь с интерактивной оболочкой прервется. Первый способ — это удаление задачи из очереди заданий при помощи команды disown:
disown
Как и в предыдущих случаях, при наличии нескольких одновременно выполняемых процессов следует указывать номер того, относительно которого будет выполнено действие:
disown %1

Убедиться, что задачи больше нет в списке заданий, можно, использовав уже знакомую утилиту jobs -l. А чтобы просмотреть перечень всех запущенных процессов (в том числе и отключенных) применяется команда
ps aux

Второй способ сохранить запущенные процессы после прекращения работы терминала — команда nohup. Она выполняет другую команду, которая была указана в качестве аргумента, при этом игнорирует все сигналы SIGHUP (те, которые получает процесс при закрытии терминала). Для запуска команды в фоновом режиме нужно написать команду в виде:
nohup command &

Как видно на скриншоте, вывод команды перенаправляется в файл nohup.out. При этом после выхода из системы или закрытия терминала процесс не завершается. Существует ряд программ, которые позволяют запускать несколько интерактивных сессий одновременно. Наиболее популярные из них — Screen и Tmux.
- Screen либо GNU Screen — это терминальный мультиплексор, который позволяет запустить один рабочий сеанс и в рамках него открыть любое количество окон (виртуальных терминалов). Процессы, запущенные в этой программе, будут выполняться, даже если их окна невидимы или программа прекратила работу.
- Tmux — более современная альтернатива GNU Screen. Впрочем, возможности Tmux не имеют принципиальных отличий — в этой программе точно так же можно открывать множество окон в рамках одного сеанса. Задачи, запущенные в Tmux, продолжают выполняться, если терминал был закрыт.
Выводы
Чтобы запустить скрипт в фоне linux, достаточно добавить в конце знак &. При запуске команд в фоновом режиме отпадает необходимость дожидаться завершения одной команды для того, чтобы ввести другую. Если у вас возникли вопросы, обязательно задавайте их в комментариях.
Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали





Не понятно только, зачем?
Например узнать адрес машины коллеги и в фоне запустить ping -i 0.2 IP_ADDRESS &> /dev/null &, а потом в SCREEN запустить тоже самое и в другом, и в другом, и в другом...
Ну и посмотреть что будет, интересно же 🙂
Пример ползованя nohup?
допустим я запустил команду типа build etc anykernel > /dev/null 2>&1 &, которая предположительно отрабатывается пару часов, смогу ли я вернуть с помощью fg %1 видимость прогресса?
Видимость ты вернёшь, только вывода не будет. Сделай перенаправление в файл, если нужен вывод build etc anykernel > file.txt 2>&1 &
Шлак
А я просто тмух (tmux) пользую и не парюсь. )))
Полезно. Спасибо.
понятно )) скажем арендовал какой нить виртуальный сервер на huperv который вместо нормального ssh сперва дает доступ к виртуальному экрану с одной консолью вот пока все на места вправишь очень помог такой способ.
А как в скрипте это можно сделать? У меня вот задачка, нужно запустить процесс чтоб он работал, потом запустить мониторинг работы этого процесса и по окончанию работы прерывать его, сейчас делаю двумя скриптами в разных окнах.
Аналогично, если при запуске процесса в скрипте вы используете &, то управление сразу же вернется скрипту.
Спасибо большое!
Как раз нужно было запустить фоном скрипт который бы не закрывался после закрытия консоли
Ситуация обратная, выполняется процесс в терминале, но комп ушел в ждущий режим, после возврата в рабочий стол пропало окно терминала с текущим заданием, как посмотреть не понятно. В ps aux этот процесс есть и потребляет ресурсы
Здравствуйте!
Подскажите, пожалуйста, как запустить в фоне интерактивный скрипт. Конкретно jigdo-lite. Или он может сам закачать несколько образов.
Спасибо!