Как запустить задачу в фоновом режиме в *nix

Существует множество способов запуска скриптов и программа в фоновом режиме в *nix системах (Linux, OS X, BSD) и не все делают это оптимальным способом. Большое количество способов представлено в этой статье, в том числе и тот, который позволяет полностью отвязать скрипт от консоли и позволить ему работать после закрытия сессии. Ниже приведён перевод этой статьи.

Самый популярный способ запуска команды в фоновом режиме в Linux

Большинство людей запускает программы при помощи добавления к команде амперсанда (&), что позволяет отвязать программу от потока stdin, позволяя запускать другие команды.

root@host:~w# ./parser.py &
[1] 11294
root@host:~# starting parsing...
launching...

При этом потоки stdout и stderr остаются привязанными к программе и вы будете наблюдать вывод любой команды в вашей сессии терминала. При этом вы не сможете спокойно пользоваться какими-либо редакторами типа emacs/vim или mc.

Помимо этого скорее всего (в зависимости от системы), при окончании сессии программа получит сигнал HUP, который завершит её при окончании сессии.

root@host:~w# ./parser.py &>/dev/null &
[1] 11494
root@host:~#

Такой запуск с перенаправлением вывода на /dev/null уже не будет выдавать никаких сообщений в консоль, но при этом также остаётся возможность того, что программа будет завершена с прекращением сессии.

Использование disown

При выполнении disown, команда отвязывается от списка задач консоли и при завершении сессии ни одна из запущенных команд не получит HUP сигнала.

root@host:~w# ./parser.py &>/dev/null &
[1] 944
root@host:~# jobs
[1+] ./parser.py &>/dev/null &
root@host:~# disown
root@host:~# jobs
root@host:~#

Использование nohup

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

root@host:~w# nohup ./parser.py &>/dev/null &
[2] 23501
[1] Done nohup ./parser.py
root@host:~#

При этом если использовать nohup без редиректа потоков, то он создаст файл nohup.out, в который по умолчанию будут переправляться все потоки.