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).