Каковы различия между
$ nohup foo
а также
$ foo &
а также
$ foo &
$ disown
shell
nohup
job-control
disown
lesmana
источник
источник
foo &!
что должно быть равносильно тому, чтобы отречься от него с самого начала.foo & disown
немедленно отречься.setsid
и о том, как оно связаноdisown
иnohup
Ответы:
Давайте сначала посмотрим, что происходит, если программа запускается из интерактивной оболочки (подключенной к терминалу) без
&
(и без какого-либо перенаправления). Итак, давайте предположим, что вы только что набралиfoo
:foo
создан.SIGHUP
, она также отправляет aSIGHUP
процессу (что обычно приводит к завершению процесса).Теперь давайте посмотрим, что произойдет, если вы поместите процесс в фоновом режиме, то есть наберите
foo &
:foo
создан.jobs
и может быть доступен с помощью%n
(гдеn
номер задания).fg
, и в этом случае он будет продолжаться, как если бы вы его не использовали&
(и если он был остановлен из-за попытки чтения со стандартного ввода, теперь он может приступить к чтению с терминала).SIGHUP
, она также отправляетSIGHUP
процесс. В зависимости от оболочки и, возможно, от параметров, установленных для оболочки, при завершении оболочки она также отправляетSIGHUP
процесс.Теперь
disown
удаляет задание из списка заданий оболочки, поэтому все подпункты выше не применяются (включая процесс, отправляемыйSIGHUP
оболочкой). Однако обратите внимание, что он все еще подключен к терминалу, поэтому, если терминал уничтожен (что может произойти, если он был pty, как те, которые созданыxterm
илиssh
, и управляющая программа завершается, закрыв xterm или разорвав соединение SSH ) программа потерпит неудачу, как только она попытается прочитать из стандартного ввода или записать в стандартный вывод.Что
nohup
, с другой стороны, состоит в том, чтобы эффективно отделить процесс от терминала:EOF
).nohup.out
, поэтому программа не сможет выполнить запись в стандартный вывод в случае сбоя терминала, поэтому все, что записывает процесс, не теряется.SIGHUP
(таким образом, имя).Обратите внимание, что
nohup
это не удаляет процесс из управления заданиями оболочки, а также не переводит его в фоновый режим (но посколькуnohup
задание на переднем плане более или менее бесполезно, вы обычно используете его в фоновом режиме&
). Например, в отличие от сdisown
, оболочка все равно сообщит вам, когда задание nohup завершено (конечно, если оболочка не была прервана раньше).Итак, подведем итог:
&
помещает задание в фоновый режим, то есть блокирует его при попытке прочитать ввод и заставляет оболочку не ждать его завершения.disown
удаляет процесс из управления заданиями оболочки, но оставляет его подключенным к терминалу. Одним из результатов является то, что оболочка не отправит егоSIGHUP
. Очевидно, что его можно применять только к фоновым заданиям, потому что вы не можете ввести его, когда выполняется задание переднего плана.nohup
отключает процесс от терминала, перенаправляет его выводnohup.out
и экранирует егоSIGHUP
. Одним из эффектов (именование) является то, что процесс не будет получать отправленныеSIGHUP
. Он полностью независим от управления заданиями и, в принципе, может использоваться и для заданий на переднем плане (хотя это не очень полезно).источник
nohup
один не спасает процесс google-chrome от закрытия, когда терминал, из которого он был запущен, закрыт ?disown %1
аdisown -h %1
? Второй будет работать как обычный (но игнорирует сигнал HUP) до выхода из терминала?(foo&)
подоболочекИспользование
&
заставляет программу работать в фоновом режиме, так что вы получите новое приглашение оболочки вместо блокировки, пока программа не завершится.nohup
иdisown
в значительной степени не связаны; они подавляют сигналы SIGHUP (зависание), поэтому программа автоматически не отключается при закрытии управляющего терминала.nohup
делает это, когда работа начинается впервые. Если у вас нетnohup
работы, когда она начинается, вы можете использовать ееdisown
для изменения выполняемой работы; без аргументов он изменяет текущую работу, которая была только фоновойисточник
nohup
иdisown
можно сказать, что оба подавляютSIGHUP
, но по-разному.nohup
заставляет программу игнорировать сигнал изначально (программа может изменить это).nohup
также пытается устроить так, чтобы программа не имела управляющего терминала, чтобыSIGHUP
ядро не отправляло его при закрытии терминала.disown
является чисто внутренней оболочкой; это заставляет оболочку не отправлять,SIGHUP
когда это завершается.disown
удаления работы из списка вакансий. Если вы не укажете опцию, она удалит ее из списка вакансий. Однако , если вы укажете эту-h
опцию, каждая спецификация заданий не будет удалена из таблицы. Вместо этого он делает так, чтобыSIGHUP
он не отправлялся на задание, если оболочка получаетSIGHUP
.&
не дает вам терминал, он отсоединяетсяstdin
от процесса и заставляет его работать в фоновом режиме, но какstdout
иstderr
по - прежнему привязан к текущему TTY. Это означает, что вы можете смешивать текст из разных программ, что может сильно раздражать, если вы делаетеgimp &
и получаете много ошибок GTK +, пытаясь использовать этот tty для чего-то другого.Вот мой опыт попытки запустить soffice в фоновом режиме, следуя не завершающей команде (например
tail
). Для этого примера я буду использоватьsleep 100
.&
nohup .. &
& отречься
Сетсид .. &
Для экономии места::
nohup setsid ..
не показывает журналы / soffice НЕ ОСТАНАВЛИВАЕТСЯ Ctrl-Cnohup
с помощью& disown
в конце: не показывает журналы / soffice останавливается Ctrl-Cисточник
nohup ⟨command⟩ & disown
созданным процесс не останавливаетсяCtrl+C
.soffice
?soffice
Команда, кажется, имеет что-то другое. Поэтому я решил добавить его здесь как правило исключения. Например, при использовании:,nohup .. &
обычное нажатиеCtrl-c
не приводит к остановке команды, но сsoffice
ней. Я жду, пока кто-нибудь не наступит на это и не объяснит, почему это происходит с soffice :)nohup soffice &
и нажалCtrl+C
. Ничего не случилось, как и ожидалось.