Глиф Учебники

Как запустить команду в фоне

Справочник · Командная строка Linux · 1 минута чтения

Поставьте & в конце команды:

Bash
./backup.sh > backup.log 2>&1 &

Команда уйдёт в фон, и приглашение сразу вернётся. Вывод лучше направить в файл, как здесь: иначе фоновая команда будет печатать прямо поверх того, что вы набираете.

Управление фоновыми задачами

КомандаЧто делает
jobsсписок задач этого терминала с номерами
fg %1вернуть задачу 1 на передний план
Ctrl+Zприостановить команду, которая работает на переднем плане
bg %1продолжить приостановленную задачу в фоне
kill %1завершить задачу 1

Забыли & у долгой команды — нажмите Ctrl+Z, затем bg: команда продолжит работу в фоне.

Чтобы команда работала после закрытия терминала

Когда окно терминала закрывается или обрывается SSH, фоновые задачи этого терминала обычно завершаются: оболочка рассылает им сигнал SIGHUP («связь с терминалом оборвалась»). Способ это обойти зависит от случая: запущена ли уже команда и нужно ли потом вернуться к ней.

Команда ещё не запущенаnohup

С nohup команда не реагирует на SIGHUP:

Bash
nohup ./backup.sh > backup.log 2>&1 &

Если вывод не перенаправить, nohup сам запишет его в файл nohup.out в текущей папке.

Дальше: «Если программа должна работать всегда»

Команда уже работает в фонеdisown

disown отвязывает от терминала команду, которая уже запущена в фоне:

Bash
./backup.sh > backup.log 2>&1 &
disown

Дальше: «Если программа должна работать всегда»

Нужно потом вернуться к сеансуtmux или screen

Лучший вариант для работы на сервере по SSH. tmux и screen держат целый терминал, который не закрывается при отключении. tmux ставится пакетом tmux.

Bash
tmux new -s work
tmux attach -t work

Первая команда открывает сеанс с именем work — запустите в нём что нужно. Чтобы отключиться, оставив всё работать, нажмите Ctrl+B, отпустите и нажмите d (маленькую). Вторая команда возвращает в сеанс, хоть после нового входа по SSH.

Если программа должна работать всегда

Бот, сайт или другая программа, которая должна работать постоянно и запускаться после перезагрузки, — это служба. В системах с systemd (Ubuntu, Debian, Mint) её описывают файлом службы, и система сама запускает её, следит за ней и перезапускает при сбое. nohup для этого не годится: после перезагрузки программа не запустится.

Подводные камни