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

Попытайтесь tcptraceroute отладить, если можно перейти к удаленному порту сначала. Если некоторая машина блокирует порт, Вы видите в выводе. Попытайтесь использовать netstat-atun видение открытых портов/соединений на обеих машинах.

29
13.04.2017, 15:36
4 ответа

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

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

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

Для ответа на вопрос делают следующее:

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

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

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

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

35
27.01.2020, 19:38
  • 1
    +1 вам обоим для больших ответов... Но я все еще смущен... Я попробовал это прежде, чем ответить на мой вопрос: возможно, моя (очень старая) установка Linux Debian правильно не настроена, но если я "emacs и", и затем введите "выход", только мои выходы xterm: emacs остается там. –  Cedric Martin 24.02.2012, 17:15
  • 2
    Emacs является сложным достаточно, что он может обработать SIGHUP самостоятельно. Это только по умолчанию, который обрабатывает выход на SIGHUP. Много программ 'демона' как ntpd или inetd перечитает их конфигурацию на SIGHUP вместо выхода. Я - парень энергии сам, таким образом, у меня нет большого опыта ни с каким emacs. –  Bruce Ediger 24.02.2012, 18:58
  • 3
    Нет ничего специального о emacs. Оболочка обычно отправляет SIGHUP к его дочерним процессам, когда сама оболочка получает SIGHUP, не, когда оболочка обычно выходит. удар имеет опцию huponexit это заставляет это отправлять SIGHUP детям, когда это выходит, но это не включено по умолчанию. прохладный gnu.org/software/bash/manual/bashref.html#Signals –  Keith Thompson 24.02.2012, 21:28

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

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

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

16
27.01.2020, 19:38
  • 1
    Извините - Вы потеряли меня. Вы говорите то использование & с nohup поддерживает команду в рабочем состоянии в определенных экземплярах где только использование nohup не был бы? Это, кажется, конфликтует с ответом здесь: unix.stackexchange.com/a/288064/1822 –  Mike B 07.06.2016, 18:21
  • 2
    @MikeB - "И" делает обычные вещи/должностное лицо ветвления/набора системные вызовы для помещения команды "в фоновом режиме". Таким образом, команда, которая получает nohupped, работает асинхронно. nohup делает некоторые вещи перед exec() системный вызов, чтобы заставить разветвленный процесс проигнорировать определенные сигналы. Так, да, "и" позволит команде работать при определенных обстоятельствах что простое nohup не был бы. Как закрытие xterm связался с оболочкой, которая сделала nohup или выходить из системы. –  Bruce Ediger 07.06.2016, 19:46

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

  ping google.com > ping_result  &

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

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

-1
27.01.2020, 19:38

Здесь не упоминается одна вещь: событие «отправить HUP при выходе из терминала» настраивается -, оно может произойти, а может и не произойти. Это может ввести некоторых людей в заблуждение относительно того, как работает nohup. Если отправка HUP при выходе из терминала отключена, они придут к выводу, что nohupне нужен. Отправка HUP при выходе из терминала — это опция оболочки в bash.

Попробуйте

shopt | grep huponexit

Это сообщит вам, отправляется ли HUP при выходе из терминала. Если это так, вам нужно будет использовать nohup. Если это не так, вы не будете.

0
25.02.2020, 15:37

Теги

Похожие вопросы