Чи ефективно функціонування `відхилення -h` та` nohup`?


18

disown

  • змушує оболонку не надсилати SIGHUP на відмовлену роботу, коли оболонка припиняється, і

  • видаляє відключене завдання з управління роботою оболонки.

Чи є перший результат другим? Іншими словами, якщо процес, запущений з оболонки, будь-яким способом буде видалений з контролю роботи оболонки, чи не передасть оболонку SIGHUP в процес, коли оболонка припиняється?

disown -h як і раніше зберігає процес під контролем роботи оболонки. Чи означає це, що disown -hзмушує процес все-таки отримувати SIGHUP, надісланий з оболонки, але встановлює дію SIGHUP процесом "ігнорувати"? Це схоже на nohup.

$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+  Running                 sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+  Stopped                 sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit

$ ps aux | grep sleep
t        26103  0.0  0.0  14584   824 ?        S    15:19   0:00 sleep 123

Чи ефективно disown -hта nohupефективно працювати, якщо ми нехтуємо їх різницею у використанні терміналу?

Спасибі.


Ще одна відмінність, про яку не йдеться тут, полягає в тому, що якщо ви не використовуєте nohup, вам потрібно перенаправити stdin / stdout / stderr подалі від TTY (якщо ваша оригінальна оболонка буде підключена до однієї) самостійно. (OTOH, я насправді вважаю, що краща практика, ніж покладатися на жахливий жорсткий код за замовчуванням, як ./nohup.out).
Чарльз Даффі

Відповіді:


21

nohupі зовсімdisown -h не те саме.

З disown, процес вилучається зі списку завдань у поточній інтерактивній оболонці. Запуск jobsпісля запуску фонового процесу та запуску disownне відображатиме цей процес як завдання в оболонці. Відмовлене завдання не отримуватиме HUPз оболонки, коли вона завершиться (але див. Примітку наприкінці).

З disown -h, завдання не вилучається зі списку завдань, але оболонка не надсилатиме йому HUPсигнал, якщо він вийшов (але дивіться примітку наприкінці).

nohupУтиліта ігнорує HUPсигнал і запускає дану утиліту. Утиліта успадковує сигнальну маску від nohupі тому також ігнорує HUPсигнал. Коли оболонка припиняється, процес залишається дочірнім процесом nohupnohupпереналагоджений для 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 . [...]

Пов'язані:


Я отримую те саме bash: disown: nohup: no such jobі для, sleepі 5від disown nohup sleep 5 &. Що ви мали на увазі під другою командою з останнього речення?
Руслан

@Ruslan Так, я пропускаю &там (і порядок nohupі disownтакож був неправильним). Спасибі. Оновиться зараз.
Кусалаланда


@Tim Вибачте за надмірне редагування відповіді. Минув деякий час, щоб обернути голову. Я закінчив зараз.
Кусалаланда

Спасибі. disownробить оболонку, яка не надсилає дитині SIGHUP, видаляючи її зі списку завдань оболонки. Як disown -hдосягти того ж?
Тім

4

Вони різні:

  • disown видаляє завдання з активної таблиці завдань. Потім продовжує продовжувати роботу. З -h процес не надсилається SIGHUP. Замість цього залишається вмирати разом із оболонкою, яка міститься в ній, коли вона отримує ВІДОМ.

  • nohup ігнорує HUP. Тоді все, що було б передано терміналу закриттям процедури, замість цього переходить у файл nohup.out.

    nohup визначається POSIX, тоді як відхилення відсутнє.


Що ви маєте на увазі, "помер з оболонкою, яка містить її"? Вбивство батьківського процесу само по собі не вбиває дитину. Програми, термінали яких закриті, зазвичай гинуть через збої, пов'язані із спробами взаємодії з файловою ручкою, приєднаною до PTY терміналу, але якщо stdin / stdout / stderr перенаправлені в інше місце, це не відбудеться.
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.