С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Фоновые задачи shell — &, jobs, nohup

3 мин bash

Запуск в фоне, управление задачами оболочки, чтобы процесс пережил выход.

Шпаргалка

7 команд Версия для печати
  • cmd & в фон
  • jobs -l список фоновых задач + PID
  • fg %1 задачу 1 — на передний план
  • bg %1 продолжить задачу 1 в фоне
  • Ctrl+Z приостановить
  • nohup cmd > out.log 2>&1 & пережить выход
  • cmd1 & cmd2 & wait параллельно и дождаться
  • службе — systemd; долгой интерактивной — tmux

Обзор

Оболочка умеет запускать задачи в фоне и управлять ими. Но «фон» в bash ≠ «переживёт выход из сессии» — для этого нужен nohup, disown или, лучше, tmux/systemd.

Рецепты

3

Команды оболочки

bash
long-cmd &                        # запустить в фоне
jobs                              # список фоновых задач оболочки
jobs -l                           # + PID
fg %1                             # вернуть задачу 1 на передний план
bg %1                             # продолжить остановленную в фоне
Ctrl+Z                            # приостановить текущую (→ в фон через bg)
kill %1                           # убить задачу оболочки (по job-спецификатору)
wait                              # ждать завершения всех фоновых
wait %1                           # ждать конкретную

Пережить выход из сессии

bash
nohup long-cmd > out.log 2>&1 &   # игнорировать SIGHUP, лог в файл
disown -h %1                      # открепить уже запущенную задачу от оболочки
setsid long-cmd >out.log 2>&1     # запустить в новой сессии (полностью отвязать)
systemd-run --user --unit=job long-cmd   # разовый transient-юнит (логи в journal)

Для служб используй systemd-юнит: он даёт автозапуск, рестарт при падении и логи в journal — nohup ничего из этого не умеет. Для интерактивных долгих задач — tmux.

Параллельный запуск

bash
cmd1 & cmd2 & cmd3 & wait         # запустить параллельно и дождаться всех
for h in h1 h2 h3; do ssh "$h" uptime & done; wait   # опрос хостов параллельно
cmd1 && cmd2                      # cmd2 только если cmd1 успешна (НЕ фон)
cmd1 || cmd2                      # cmd2 только если cmd1 упала
( cd /tmp && long ) &             # фоновый субшелл со своим каталогом

Для серьёзной параллельности — xargs -P N (см. xargs) или GNU parallel.

Неполадки

4

Процесс умер после закрытия SSH

По & он привязан к сессии и получает SIGHUP при выходе. Запускай через nohup ... &, disown, tmux или сделай systemd-службой.

Вывод фоновой задачи засоряет терминал

Перенаправь stdout и stderr: cmd > out.log 2>&1 &.

Ctrl+Z «завис» процесс

Это не убийство — процесс приостановлен (stopped, состояние T). fg вернёт, bg продолжит в фоне, kill %1 завершит (см. processes).

Скрипт завершился, а фоновые ещё работают/осиротели

Добавь wait в конце, либо trap 'kill 0' EXIT чтобы прибить группу при выходе.

Термины

3
задание оболочки shell job
Запущенная оболочкой команда или конвейер, учитываемые в её локальной таблице заданий. Ещё встречается в: stress-ng
передний план foreground
Режим, в котором оболочка ждёт окончания команды: терминал занят ею, Ctrl+C и Ctrl+Z действуют на неё. Задание из фона возвращает fg. Ещё встречается в: Dockerfile, sleep, Docker, Процессы и ещё 1
фон (фоновое задание) background (background job)
Режим, в котором команда работает, а оболочка сразу печатает приглашение: команду запускают с & в конце или продолжают командой bg. Ещё встречается в: wait, sleep, kill, tmux и ещё 8

См. также

  • processes — Просмотр, сигналы и приоритеты процессов; поиск пожирателей CPU/памяти.
  • tmux — Сессии, которые переживают разрыв SSH; окна и панели.
Загрузка…