Коли вам потрібен "nohup", якщо ви вже використовуєте "&"?


26

Спочатку це питання пов'язане, але, безумовно, не те саме, що це дуже приємне запитання:

Різниця між nohup, disown і &

Я хочу щось зрозуміти: коли я роблю '&', я розмовляю правильно?

Чи корисно робити "nohup ... &" або просто і достатньо?

Чи може хтось показати випадок, коли ви використовуєте "&" і все ж хочете використовувати "nohup"?


1
Ви прочитали прийняту відповідь та її нитку коментарів? Вони пояснюють, що nohupробить. Яку частину ви збентежили?
Жил 'ТАК - перестань бути злим'

3
@Gilles: це може бути очевидним для вас , тому що ви випадково знайомі з цими речами (бачив ваш представник) ... Однак для початку прийнята відповідь у посиланні, яке я зробив , не говорить ні слова про використання і nohup, і "&" ... Я впевнений, що моє запитання досить чітке і досить відрізняється від інших, і два чудових відповіді тут, здається, підтверджують це; ) Крім того, ви насправді маєте на увазі, що я поклав біль, щоб посилання на інше питання, але не читаючи прийнятої відповіді !?
Седрік Мартін

Відповіді:


32

Перш за все, кожного разу, коли ви виконуватимете команду, оболонка буде форклом нового процесу, незалежно від того, запускаєте ви його &чи ні. &означає лише, що ви працюєте у фоновому режимі.

Зауважте, це не дуже точно. Деякі команди, як-от cdфункція оболонки, зазвичай не розщеплюють новий процес. type cmdзазвичай скаже вам, чи cmdце зовнішня команда, чи функція оболонки. type typeговорить вам, що typeсама функція оболонки.

nohupце щось інше. Це повідомляє новий процес ігнорувати SIGHUP. Це сигнал, що надсилається ядром, коли батьківська оболонка закрита.

Щоб відповісти на ваше запитання, виконайте наступне:

  1. run emacs & (за замовчуванням має працювати в окремому вікні X) .
  2. на батьківській оболонці запустіть exit.

Ви помітите, що emacsвікно вбито, незважаючи на те, що він працює у фоновому режимі. Це поведінка за замовчуванням і nohupвикористовується саме для зміни цього.

Виконання роботи у фоновому режимі (з &або bg, я впевнений , іншими снарядами мають інший синтаксис, а) є функцією оболонки, що випливають з можливості сучасних систем багатозадачних. Замість того , щоб розгалуження нового примірника оболонки для кожної програми , яку ви хочете запустити, сучасні оболонок ( bash, zsh, ksh...) буде мати можливість керувати списком програм (або завдань ). Лише одна з них одночасно може бути на передньому плані , тобто вона отримує фокус оболонки. Я б хотів, щоб хтось міг розширити більше відмінностей між процесом, що працює на передньому плані, і процесом на задньому плані (головний з них має доступ до stdin/ stdout).

У будь-якому випадку це не впливає на те, як реагує дитячий процес SIGHUP. nohupробить.


+1 вам обом за чудові відповіді ... Але я все ще плутаюсь ... Я намагався це, перш ніж відповісти на моє запитання: можливо, моя (дуже стара) настройка Debian Linux неправильно налаштована, але якщо я "emacs & ", а потім наберіть" вихід ", тільки мій xterm виходить: emacs залишається там.
Седрік Мартін

Emacs є досить складним, що може самостійно працювати з SIGHUP. Це лише за замовчуванням, що обробляє вихід на SIGHUP. Багато програм "демона", таких як ntpd або inetd, перечитають їх конфігурацію на SIGHUP замість виходу. Я сам вим хлопець, тому не маю багато досвіду з будь-яким emacs.
Брюс Едігер

3
У Emacs немає нічого особливого. Оболонка зазвичай надсилає SIGHUPдочірнім процесам, коли сама оболонка отримує SIGHUP, а не тоді, коли оболонка нормально виходить. bash має опцію, huponexitяка змушує його надсилати SIGHUPдітям, коли він виходить, але він не включений за замовчуванням. gnu.org/software/bash/manual/bashref.html#Signals
Кіт Томпсон

Привіт. насамперед, чудове пояснення. Я спробував перевірити вашу дипломну роботу, запустивши процес &і запустивши свою оболонку запуском exit. Процес все ще триває. Будь-які ідеї, чому його не вбили? Або я щось тут пропускаю?
Алі Йылмаз

Який процес ви запустите?
rahmu

16

Чи корисно це робити коли-небудь nohup ... &? Так. Якщо ви просто починаєте процес "у фоновому режимі" &, цей новий процес все ще має членство в "групі процесів" оригінальної оболонки. Якщо ця оболонка або група процесів отримує певні сигнали (наприклад, SIGHUP), вони за замовчуванням виходять. Це означає, що якщо ви запускаєте процес із &оболонки, запущеної xterm, або rxvt чи іншим емулятором терміналу віконного режиму, коли ви закриваєте вікно, фоновий процес отримує SIGHUP. Більшість випадково написаних кодів не спрацьовує SIGHUP, а тому виходить.

У цьому nohup ... &випадку nohupкоманда встановлює SIGHUP на ігнорування, а потім виконує команду. Ця нещодавно виконана команда зберігає маску сигналу цього nohupналаштування, якщо тільки команда не здійснює обробку сигналу сама. Якщо ви закриєте xterm або rxvt чи будь-що інше, ядро ​​доставляє SIGHUP в процес команди, який ігнорується. Це продовжує працювати.

Якщо nohupкоманда виконує команду, вона може продовжувати працювати після закриття xterm або виходу з системи.


Вибачте - ви мене втратили. Ви хочете сказати, що використання &з nohupутримує команду, що працює в певних випадках, коли тільки використання nohupне буде? Це, здається, суперечить відповіді тут: unix.stackexchange.com/a/288064/1822
Майк Б

2
@MikeB - "&" виконує звичайні вилки / встановлює речі / exec для викликів системи, щоб поставити команду "на задній план". Тобто, команда, яка не працює, працює асинхронно. nohupРоблять деякі речі до exec()системного виклику , щоб зробити роздвоєний процес ігнорувати певні сигнали. Так, так, "&" дозволить команді виконуватись за певних обставин, яких звичайний старий nohupне хотів. Як і закриття xterm, пов’язаного з оболонкою, яка зробила нохуп, або вихід із системи.
Брюс Едігер

-1

якщо ви запускаєте програму у фоновому режимі (з & як суфікс) в операційній системі Linux та виходите навіть після цього, вона продовжуватиме працювати: спробуйте:

  ping google.com > ping_result  &

Після повернення до входу перевірте кількість рядків у вихідному файлі, ping_resultякий буде постійно збільшуватися, означає, що він все ще працює, однак було сказано, що він буде закритий. то в чому полягає використання nohupкоманди.

інший сценарій ==> як зазначено вище для nohup emac &->, який повинен продовжувати emacпрацювати після виходу з системи, але він не відображається після входу в систему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.