Различие между nohup, отрицайте и и

Если Вы хотите использовать HTTPS для предотвращения некоторых потенциальных ловушек:

_result=$(wget -qO- https://ipcheckit.com/)
_result="${_result##*Your IP address is<br><b>}"
printf '%s\n' "${_result%%</b></p>*}"
591
19.09.2018, 01:18
3 ответа

Давайте сначала посмотрим, что происходит, если программа запускается из интерактивной оболочки (подключенной к терминалу) без и (и без перенаправления). Итак, предположим, что вы только что набрали foo :

  • Создается процесс, выполняющий foo .
  • Процесс наследует stdin, stdout и stderr от оболочки. Следовательно, он также подключен к тому же терминалу.
  • Если оболочка получает SIGHUP , она также отправляет SIGHUP процессу (что обычно вызывает завершение процесса).
  • В противном случае оболочка ждет (блокируется), пока процесс не завершится.

Теперь давайте посмотрим, что произойдет, если вы поместите процесс в фоновый режим, то есть наберете foo & :

  • Будет создан запущенный процесс foo .
  • Процесс наследует stdout / stderr от оболочки (поэтому он по-прежнему выполняет запись в терминал).
  • Процесс в принципе также наследует stdin, но как только он пытается прочитать из stdin, он останавливается.
  • Он помещается в список фоновых заданий, которыми управляет оболочка, что, в частности, означает:
    • Он указан с заданиями и доступен с помощью % 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 . Он полностью независим от управления заданиями и, в принципе, может использоваться также для заданий переднего плана (хотя это не очень полезно).
578
27.01.2020, 19:27

Используя & заставляет программу работать в фоновом режиме, таким образом, Вы получите новое приглашение оболочки вместо того, чтобы блокироваться, пока программа не закончится. nohup и disown в основном не связаны; они подавляют SIGHUP (зависание) сигналы, таким образом, программа автоматически не закрыта, когда терминал управления закрывается. nohup делает это, когда задание сначала начинается. Если Вы не делаете nohup задание, когда это начинается, можно использовать disown изменить рабочее задание; без аргументов это изменяет текущее задание, которое является тем, которое было просто фоном

173
27.01.2020, 19:27
  • 1
    между nohup и отрицают: отрицать команда удалит его из Вашего списка заданий; nohup не будет. –  Shawn J. Goff 09.11.2010, 18:41
  • 2
    nohup и disown оба, как могут говорить, подавляют SIGHUP, но по-разному. nohup заставляет программу проигнорировать сигнал первоначально (программа может изменить это). nohup также попытки принять меры, чтобы программа не имела терминал управления, так, чтобы это не было отправлено SIGHUP ядром, когда терминал закрывается. disown является чисто внутренним к оболочке; это заставляет оболочку не отправлять SIGHUP когда это завершается. –  Gilles 'SO- stop being evil' 09.11.2010, 20:26
  • 3
    @Gilles, Ваш комментарий стоит ответа себя. –  lesmana 10.11.2010, 20:30
  • 4
    Просто разъяснение по поводу имеющего отношение комментария @ShawnJ.Goff disown удаление задания из списка заданий. Если Вы не указываете опцию, она действительно удаляет его из списка заданий. Однако, если Вы указываете -h опция, каждый jobspec не удален из таблицы. Вместо этого это делает его так, чтобы SIGHUP не отправляется в задание, если оболочка получает a SIGHUP. –  tacotuesday 13.11.2013, 08:54
  • 5
    Просто для уточнения, использование & не дает Вам терминал, он отсоединяется stdin от процесса и причин это для выполнения в фоновом режиме, но оба stdout и stderr все еще присоединен к текущему tty. Это означает, что можно получить текст из различных программ, перепутанных вместе, который может быть довольно раздражающим, если Вы делаете gimp & и получите много GTK + ошибки при попытке использовать это tty для чего-то еще. –  Frank 06.06.2014, 00:18

Вот мой опыт попытки запустить soffice в фоновом режиме после не- завершающая команда (например, хвост ). В этом примере я буду использовать sleep 100 .

&

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I см. soffice logs / нажатием Ctrl - C soffice останавливается

nohup .. &

#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Я не вижу soffice журналы / при нажатии Ctrl - C soffice останавливается

и отключается

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

Я вижу soffice журналы / нажав Ctrl - C soffice останавливается

setid .. &

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

I см. soffice журналы / нажав Ctrl - C soffice НЕ ОСТАНАВЛИВАЕТСЯ

Для экономии места:
nohup setsid. . : не показывает журналы / soffice НЕ ОСТАНАВЛИВАЕТСЯ на Ctrl - C
nohup с и disown в конце: не показывает логи / soffice останавливается на Ctrl - C

8
27.01.2020, 19:27

Теги

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