Вики / Процессы
Фоновые задачи (&, jobs, nohup)
Запуск в фоне, управление задачами оболочки, чтобы процесс пережил выход.
Оболочка умеет запускать задачи в фоне и управлять ими. Но «фон» в 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
См. также
- tmux (мультиплексор терминала) — Базовые команды
- Процессы (ps, top, kill, nice) — Процессы