Сначала этот вопрос связан, но определенно не совпадает с этим очень хорошим вопросом:
Разница между nohup, disown и &
Я хочу кое-что понять: когда я делаю '&', я разветвляюсь, верно?
Всегда ли полезно делать "nohup ... &" или просто и достаточно?
Может ли кто-нибудь показать случай, когда вы будете использовать '&' и все же захотите использовать 'nohup'?
nohup
делает. Какую часть вы запутали?Ответы:
Прежде всего, каждый раз, когда вы выполняете команду, ваша оболочка будет форкать новый процесс, независимо от того, запускаете вы его
&
или нет.&
только означает, что вы запускаете его в фоновом режиме.Обратите внимание, это не очень точно. Некоторые команды, например,
cd
являются функциями оболочки и обычно не будут создавать новый процесс.type cmd
обычно скажет вам,cmd
является ли это внешняя команда или функция оболочки.type type
говорит вам, чтоtype
сама по себе является функцией оболочки.nohup
это что-то другое. Это говорит новому процессу игнорироватьSIGHUP
. Это сигнал, посылаемый ядром, когда родительская оболочка закрыта.Чтобы ответить на ваш вопрос, сделайте следующее:
emacs &
(по умолчанию должен запускаться в отдельном окне X) .exit
.Вы заметите, что
emacs
окно убито, несмотря на то, что работает в фоновом режиме. Это поведение по умолчанию иnohup
используется именно для его изменения.Запуск задания в фоновом режиме (с
&
илиbg
, я уверен, другие оболочки также имеют другие синтаксисы) - это функция оболочки, проистекающая из способности современных систем работать в многозадачном режиме. Вместо того , чтобы разветвление нового экземпляра оболочки для каждой программы , которую вы хотите запустить, современные оболочек (bash
,zsh
,ksh
...) будет иметь возможность управлять списком программ (или заданий ). Только один из них одновременно может быть на переднем плане , то есть он получает фокус оболочки. Я хотел бы, чтобы кто-нибудь мог больше рассказать о различиях между процессом, выполняющимся на переднем плане, и процессом на заднем плане (основным из которых является доступ кstdin
/stdout
).В любом случае это не влияет на реакцию дочернего процесса
SIGHUP
.nohup
делает.источник
SIGHUP
дочерним процессам, когда сама оболочка получаетSIGHUP
, а не когда оболочка завершается нормально. В bash есть опция,huponexit
которая заставляет его отправлятьSIGHUP
дочерние элементы при выходе, но по умолчанию она не включена. gnu.org/software/bash/manual/bashref.html#Signals&
и закрыв мою оболочку, запустивexit
. Процесс все еще работает. Есть идеи, почему его не убили? Или я что-то здесь упускаю?Это когда-нибудь полезно делать
nohup ... &
? Да. Если вы просто запускаете процесс «в фоновом режиме»&
, этот новый процесс все еще имеет членство в «группе процессов» исходной оболочки. Если эта оболочка или группа процессов получают определенные сигналы (например, SIGHUP), по умолчанию они завершаются. Это означает, что если вы запустите процесс с&
из оболочки, запущенной xterm, или rxvt, или каким-либо другим эмулятором оконного терминала, то при закрытии окна фоновый процесс получит SIGHUP. Большинство случайно написанного кода не обрабатывает SIGHUP и поэтому завершается.Если вы это сделаете
nohup ... &
,nohup
команда устанавливает SIGHUP на игнорируемое значение, а затем выполняет команду. Эта новая команда exec'ed сохраняет маску сигналов, которая былаnohup
настроена, если только сама команда не выполняет некоторую обработку сигналов. Если вы закроете xterm или rxvt или что-то еще, ядро доставит SIGHUP процессу команды, который игнорируется. Он продолжает работать.Выполнение команды
nohup
on позволяет продолжить работу после закрытия xterm или выхода из системы.источник
&
withnohup
поддерживает выполнение команды в определенных случаях, когда только использованиеnohup
не будет? Это, кажется, противоречит ответу здесь: unix.stackexchange.com/a/288064/1822nohup
выполняет некоторые действия передexec()
системным вызовом, чтобы заставить разветвленный процесс игнорировать определенные сигналы. Так что, да, «&» разрешит выполнение команды при определенных обстоятельствах,nohup
которые не могут выполнять старые . Например, закрыть xterm, связанный с оболочкой, которая выполнила nohup, или выйти из системы.если вы запускаете программу в фоновом режиме (с & в качестве суффикса) в операционной системе Linux и выходите из системы даже после этого, она продолжит работать: попробуйте выполнить:
После повторного входа проверьте количество строк в выходном файле,
ping_result
которые будут увеличиваться, что означает, что он все еще работает, однако было сказано, что он будет закрыт. тогда какая польза отnohup
команды.другой сценарий ==> как указано выше для
nohup emac &
->, который должен продолжатьemac
работать после выхода из системы, но он не показывает запуск после входа в систему.источник