Как правило, выполнение команд в терминале связано с одним неудобством — прежде чем приступить к вводу следующей команды, следует дождаться выполнения предыдущей. Это происходит, поскольку текущий процесс блокирует доступ к оболочке операционной системы и в таких случаях говорят, что команда выполняется на переднем плане. Что же делать, если нужно запустить несколько команд одновременно? Есть несколько решений. Первое и наиболее очевидное — открыть дополнительное окно терминала. Второе — инициировать выполнение команды в фоновом режиме.
Если какой-либо процесс происходит в фоновом режиме, это значит, что он не предусматривает взаимодействия с пользователем, следовательно, доступ к оболочке остается свободным. Прочитав эту статью, вы узнаете как запустить процесс в фоне 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, достаточно добавить в конце знак &. При запуске команд в фоновом режиме отпадает необходимость дожидаться завершения одной команды для того, чтобы ввести другую. Если у вас возникли вопросы, обязательно задавайте их в комментариях.
Не понятно только, зачем?
Например узнать адрес машины коллеги и в фоне запустить 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 этот процесс есть и потребляет ресурсы