Когда вам нужен nohup, если вы уже разветвляетесь, используя '&'?

26

Сначала этот вопрос связан, но определенно не совпадает с этим очень хорошим вопросом:

Разница между nohup, disown и &

Я хочу кое-что понять: когда я делаю '&', я разветвляюсь, верно?

Всегда ли полезно делать "nohup ... &" или просто и достаточно?

Может ли кто-нибудь показать случай, когда вы будете использовать '&' и все же захотите использовать 'nohup'?

Седрик Мартин
источник
1
Вы прочитали принятый ответ и его ветку комментариев? Они объясняют, что nohupделает. Какую часть вы запутали?
Жиль "ТАК - перестань быть злым"
3
@ Жиль: это может быть очевидно для вас , потому что вы, кажется, знакомы с этими вещами (видели вашего представителя) ... Однако, для начала, принятый ответ в ссылке, которую я сделал , не говорит ни слова об использовании и nohup, и '&' ... Я почти уверен, что мой вопрос достаточно ясен и достаточно отличается от другого, и два отличных ответа здесь, кажется, доказывают это; ) Кроме того, вы действительно намекаете, что я постарался сделать ссылку на другой вопрос, но без прочтения принятого ответа !?
Седрик Мартин

Ответы:

32

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

Обратите внимание, это не очень точно. Некоторые команды, например, cdявляются функциями оболочки и обычно не будут создавать новый процесс. type cmdобычно скажет вам, cmdявляется ли это внешняя команда или функция оболочки. type typeговорит вам, что typeсама по себе является функцией оболочки.

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

Чтобы ответить на ваш вопрос, сделайте следующее:

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

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

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

В любом случае это не влияет на реакцию дочернего процесса SIGHUP. nohupделает.

rahmu
источник
+1 вам обоим за отличные ответы ... Но я все еще в замешательстве ... Я пытался это сделать, прежде чем ответить на мой вопрос: возможно, моя (очень старая) установка Debian Linux настроена неправильно, но если я "emacs & ", а затем введите" выход ", только мой xterm выходит: Emacs остается там.
Седрик Мартин
Emacs достаточно сложен, чтобы самостоятельно обрабатывать SIGHUP. Только по умолчанию процессы выходят на SIGHUP. Многие программы-демоны, такие как ntpd или inetd, будут перечитывать свою конфигурацию на SIGHUP вместо выхода. Я сам vim, поэтому у меня нет большого опыта работы с emacs.
Брюс Эдигер
3
В Emacs нет ничего особенного. Оболочка обычно отправляет SIGHUPдочерним процессам, когда сама оболочка получает SIGHUP, а не когда оболочка завершается нормально. В bash есть опция, huponexitкоторая заставляет его отправлять SIGHUPдочерние элементы при выходе, но по умолчанию она не включена. gnu.org/software/bash/manual/bashref.html#Signals
Кит Томпсон
Здравствуйте. Прежде всего, отличное объяснение. Я попытался проверить ваш тезис, запустив процесс &и закрыв мою оболочку, запустив exit. Процесс все еще работает. Есть идеи, почему его не убили? Или я что-то здесь упускаю?
Али Йылмаз
Какой процесс вы используете?
Рахму
16

Это когда-нибудь полезно делать nohup ... &? Да. Если вы просто запускаете процесс «в фоновом режиме» &, этот новый процесс все еще имеет членство в «группе процессов» исходной оболочки. Если эта оболочка или группа процессов получают определенные сигналы (например, SIGHUP), по умолчанию они завершаются. Это означает, что если вы запустите процесс с& из оболочки, запущенной xterm, или rxvt, или каким-либо другим эмулятором оконного терминала, то при закрытии окна фоновый процесс получит SIGHUP. Большинство случайно написанного кода не обрабатывает SIGHUP и поэтому завершается.

Если вы это сделаете nohup ... &, nohupкоманда устанавливает SIGHUP на игнорируемое значение, а затем выполняет команду. Эта новая команда exec'ed сохраняет маску сигналов, которая была nohupнастроена, если только сама команда не выполняет некоторую обработку сигналов. Если вы закроете xterm или rxvt или что-то еще, ядро ​​доставит SIGHUP процессу команды, который игнорируется. Он продолжает работать.

Выполнение команды nohupon позволяет продолжить работу после закрытия xterm или выхода из системы.

Брюс Эдигер
источник
Извините - вы потеряли меня. Вы говорите, что использование &with nohupподдерживает выполнение команды в определенных случаях, когда только использование nohupне будет? Это, кажется, противоречит ответу здесь: unix.stackexchange.com/a/288064/1822
Майк Б
2
@MikeB - "&" выполняет обычные системные вызовы fork / set вещи / exec, чтобы поместить команду "в фоновом режиме". То есть команда, которая получает nohupped, выполняется асинхронно. Он nohupвыполняет некоторые действия перед exec()системным вызовом, чтобы заставить разветвленный процесс игнорировать определенные сигналы. Так что, да, «&» разрешит выполнение команды при определенных обстоятельствах, nohupкоторые не могут выполнять старые . Например, закрыть xterm, связанный с оболочкой, которая выполнила nohup, или выйти из системы.
Брюс Эдигер
-1

если вы запускаете программу в фоновом режиме (с & в качестве суффикса) в операционной системе Linux и выходите из системы даже после этого, она продолжит работать: попробуйте выполнить:

  ping google.com > ping_result  &

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

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

адитйа
источник