linux-labs

Вики / Процессы

Фоновые задачи (&, jobs, nohup)

Концепция bash ПроцессыБазовое

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

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

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

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

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.

Процесс умер после закрытия 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 чтобы прибить группу при выходе.

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

См. также