nohup
и disown -h
не совсем то же самое.
При disown
этом процесс удаляется из списка заданий в текущей интерактивной оболочке. Запуск jobs
после запуска фонового процесса и его запуск disown
не будут отображать этот процесс как задание в оболочке. Отказавшееся задание не получит HUP
от оболочки при выходе (но см. Примечание в конце).
При disown -h
этом задание не удаляется из списка заданий, но оболочка не будет отправлять ему HUP
сигнал, если оно завершится (но см. Примечание в конце).
nohup
Утилита игнорирует HUP
сигнал и запускает данную утилиту. Утилита наследует маску сигнала nohup
и поэтому также игнорирует HUP
сигнал. Когда оболочка завершается, этот процесс остается дочерним процессом nohup
(и nohup
повторно связан с ним init
).
Разница в том, что процесс начался с nohup
игнорирования HUP
независимо от того, кто посылает сигнал. В отрекся процессы просто не послал на HUP
сигнал оболочкой , но по- прежнему может быть послан сигнал , например , от kill -s HUP <pid>
и не будет игнорировать это.
Обратите внимание, что HUP
отправляется на задания оболочки только если
- оболочка является оболочкой входа в систему, и
huponexit
опция оболочки установлена, или
- сама оболочка получает
HUP
сигнал.
Соответствующие биты из bash
руководства (мой акцент):
СИГНАЛЫ
[...]
По умолчанию оболочка завершает работу при полученииSIGHUP
. Перед выходом интерактивная оболочка отправляет SIGHUP
все задания, запущенные или остановленные. Остановленные работы отправляются, SIGCONT
чтобы гарантировать, что они получают
SIGHUP
. Чтобы оболочка не отправляла сигнал на конкретное задание, его следует удалить из таблицы заданий с помощью disown
встроенной функции (см. SHELL BUILTIN COMMANDS
Ниже) или пометить, чтобы он не принимался SIGHUP
с помощью disown -h
.
Если параметр huponexit
оболочки был установлен с помощью shopt
, bash
отправляет a
SIGHUP
всем заданиям при выходе из интерактивной оболочки входа.
disown [-ar] [-h] [jobspec ... | pid ... ]
Без опций удалите каждую jobspec
из таблицы активных заданий. [...] Если -h
указан параметр, каждый из jobspec
них не удаляется из таблицы, а помечается, чтобы SIGHUP
не отправляться на задание, если оболочка получает aSIGHUP
. [...]
Связанный:
nohup
, вам нужно перенаправить stdin / stdout / stderr из TTY (если ваша исходная оболочка подключена к нему) самостоятельно. (OTOH, я на самом деле считаю, что это лучшая практика, чем полагаться на вопиющее жестко заданное значение по умолчанию, как./nohup.out
).