Оболочка умеет запускать задачи в фоне и управлять ими. Но «фон» в 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 чтобы прибить группу при выходе.
Режим, в котором оболочка ждёт окончания команды: терминал занят ею, Ctrl+C и Ctrl+Z действуют на неё. Задание из фона возвращает fg.Ещё встречается в:
Dockerfile, sleep, Docker, Процессы и ещё 1
Режим, в котором команда работает, а оболочка сразу печатает приглашение: команду запускают с & в конце или продолжают командой bg.Ещё встречается в:
wait, sleep, kill, tmux и ещё 8
См. также
processes — Просмотр, сигналы и приоритеты процессов; поиск пожирателей CPU/памяти.
tmux — Сессии, которые переживают разрыв SSH; окна и панели.