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
надсилає
SIGHUP
на всі завдання, коли виходить інтерактивна оболонка входу.
disown [-ar] [-h] [jobspec ... | pid ... ]
Без параметрів видаліть кожну jobspec
зі таблиці активних завдань. [...] Якщо -h
опція задана, кожен jobspec
буде з сайту не видаляються з таблиці, але відзначений так , що SIGHUP
не потрапляють на роботу , якщо оболонка отримуєSIGHUP
. [...]
Пов'язані:
nohup
, вам потрібно перенаправити stdin / stdout / stderr подалі від TTY (якщо ваша оригінальна оболонка буде підключена до однієї) самостійно. (OTOH, я насправді вважаю, що краща практика, ніж покладатися на жахливий жорсткий код за замовчуванням, як./nohup.out
).