Как запустить команду в фоне
Поставьте & в конце команды:
./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:
nohup ./backup.sh > backup.log 2>&1 &Если вывод не перенаправить, nohup сам запишет его в файл nohup.out в текущей папке.
Команда уже работает в фонеdisown
disown отвязывает от терминала команду, которая уже запущена в фоне:
./backup.sh > backup.log 2>&1 &
disownНужно потом вернуться к сеансуtmux или screen
Лучший вариант для работы на сервере по SSH. tmux и screen держат целый терминал, который не закрывается при отключении. tmux ставится пакетом tmux.
tmux new -s work
tmux attach -t workПервая команда открывает сеанс с именем work — запустите в нём что нужно. Чтобы отключиться, оставив всё работать, нажмите Ctrl+B, отпустите и нажмите d (маленькую). Вторая команда возвращает в сеанс, хоть после нового входа по SSH.
Если программа должна работать всегда
Бот, сайт или другая программа, которая должна работать постоянно и запускаться после перезагрузки, — это служба. В системах с systemd (Ubuntu, Debian, Mint) её описывают файлом службы, и система сама запускает её, следит за ней и перезапускает при сбое. nohup для этого не годится: после перезагрузки программа не запустится.
Подводные камни
- Фоновая команда, которой нужен ввод с клавиатуры, остановится и будет ждать, пока её не вернут через
fg. jobsвидит задачи только своего терминала. Из другого окна процесс ищут черезpgrep -a имя.Ctrl+Cне действует на фоновую задачу: завершайте её черезkill %номерилиkill PID.