it-swarm-ru.tech

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

Каковы различия между

$ Nohup foo

а также

$ foo &

а также

$ foo & 
$ disown
600
lesmana

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

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

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

  • Процесс, запущенный foo, создан.
  • Процесс наследует stdout/stderr от командной консоли (поэтому он все еще пишет в терминал).
  • Процесс в принципе также наследует стандартный ввод, но как только он пытается прочитать из стандартного ввода, он останавливается.
  • Он занесен в список фоновых заданий, которыми управляет Shell, в частности:
    • Он указан с помощью jobs и ​​доступен с помощью %n (где n - номер задания).
    • Его можно превратить в задание переднего плана, используя fg, и в этом случае оно продолжается, как если бы вы не использовали & (и если он был остановлен из-за попытки чтения со стандартного ввода, теперь он может продолжить чтение с терминала).
    • Если оболочка получила SIGHUP, она также отправляет SIGHUP процессу. В зависимости от командной консоли и, возможно, от параметров, установленных для командной консоли, при завершении командной оболочки она также отправляет SIGHUP процессу.

Теперь disown удаляет задание из списка заданий оболочки, поэтому все подпункты выше не применяются (включая процесс, отправляемый SIGHUP оболочкой). Однако обратите внимание, что он по-прежнему подключен к терминалу, поэтому, если терминал уничтожен (что может произойти, если он был pty, как те, что были созданы xterm или ssh, и управляющая программа завершается, закрывая xterm или прерывая соединение SSH ), программы потерпит неудачу, как только он попытается прочитать из стандартного ввода или записи в стандартный вывод.

С другой стороны, Nohup позволяет эффективно отделить процесс от терминала:

  • Он закрывает стандартный ввод (программа не сможет прочитать любой ввод, даже если он запущен на переднем плане. Он не остановлен, но будет получить код ошибки или EOF).
  • Перенаправляет стандартный вывод и стандартную ошибку в файл Nohup.out, поэтому программа не сможет выполнить запись в стандартный вывод в случае сбоя терминала, поэтому все, что записывает процесс, не теряется.
  • Он не позволяет процессу получить SIGHUP (то есть имя).

Обратите внимание, что Nohup не удаляет процесс из управления работой оболочки, а также не переводит его в фоновый режим (но, поскольку передний план Nohup задание более или менее бесполезно, вы обычно помещаете его в фон, используя &). Например, в отличие от disown, оболочка все равно сообщит вам о завершении задания Nohup (если, конечно, оболочка не была прервана ранее).

Итак, подведем итог:

  • & переводит задание в фоновый режим, то есть блокирует его при попытке прочитать ввод и заставляет Shell не ждать его завершения.
  • disown удаляет процесс из управления заданиями командной консоли, но все равно оставляет его подключенным к терминалу. Одним из результатов является то, что Shell не отправит ему SIGHUP. Очевидно, что его можно применять только к фоновым заданиям, потому что вы не можете ввести его, когда выполняется задание переднего плана.
  • Nohup отключает процесс от терминала, перенаправляет его вывод на Nohup.out и ​​экранирует его от SIGHUP. Одним из эффектов (именование) является то, что процесс не будет получать отправленные SIGHUP. Он полностью независим от управления заданиями и, в принципе, может использоваться и для заданий на переднем плане (хотя это не очень полезно).
595
celtschk

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

174
Michael Mrozek

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

&

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

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

Nohup .. &

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

Я не вижу soffice логи/нажатием Ctrl-C Соффис останавливается

& отречься

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

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

сетсид .. &

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

Я см. soffice logs /, нажав Ctrl-C soffice НЕ ОСТАНАВЛИВАЕТСЯ

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

9
Marinos An