В чем разница между nohup и демоном?

Каковы последствия запуска сценария в качестве демона по сравнению с использованием nohup?

Я знаю, в чем разница с точки зрения процессов разветвления и т. Д., Но как это повлияет на мой скрипт?


person Hortitude    schedule 05.06.2009    source источник


Ответы (4)


Команда nohup - это плохой способ запустить процесс как демон. Как заметил Бруно Раншарт, когда вы запускаете команду в интерактивной оболочке, она имеет управляющий терминал и будет получать сигнал SIGHUP (зависание), когда контролирующий процесс (обычно ваша оболочка входа в систему) завершается. Команда nohup упорядочивает входные данные из /dev/null, а также выход и ошибки в nohup.out, а также игнорирование программой прерываний, сигналов выхода и зависаний. На самом деле он все еще имеет тот же управляющий терминал - он просто игнорирует элементы управления терминалом. Обратите внимание: если вы хотите, чтобы процесс выполнялся в фоновом режиме, вы должны указать оболочке запускать его в фоновом режиме - по крайней мере, в Solaris (то есть вы набираете 'nohup sleep 20 &'; без амперсанда процесс выполняется синхронно в передний план).

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

Обычно (что означает, что если вы очень постараетесь, вы можете найти исключения из этих правил), процесс-демон - это что-то, что скрывается в фоновом режиме, отключено от любого терминала, но ожидает ответа на какой-либо ввод. Сетевые демоны ждут запросов на соединение или сообщений UDP, которые поступят по сети, выполняют соответствующую работу и снова отправляют ответ. Подумайте, например, о веб-сервере или СУБД.

Когда процесс полностью демонизирует себя, он выполняет некоторые из шагов, которые выполняет код nohup; он перестраивает свой ввод-вывод так, чтобы он не был подключен к какому-либо терминалу, отделяется от группы процессов, игнорирует соответствующие сигналы (что может означать, что он не игнорирует никакие сигналы, поскольку нет терминала для отправки ему любого из сгенерированных сигналов через терминал). Обычно он разветвляется один раз, и родитель успешно завершает работу. Дочерний процесс обычно разветвляется второй раз после исправления группы процессов, идентификатора сеанса и т. Д. затем ребенок тоже уходит. Внук-процесс теперь автономен и не будет отображаться в выходных данных ps для терминала, на котором он был запущен.

Вы можете посмотреть Расширенное программирование в среде Unix, 3-е изд. Ричард Стивенс и Стивен А. Раго или Advanced Unix Programming, 2nd Edn, автор Marc J Rochkind за обсуждение демонизации.

У меня есть программа daemonize, которая будет демонизировать программу, которая не знает, как демонизировать себя (должным образом). Он был написан для устранения дефектов в программе, которая должна была демонстрировать себя, но не выполняла свою работу должным образом. Свяжитесь со мной, если хотите - см. Мой профиль.

person Jonathan Leffler    schedule 05.06.2009
comment
Не уверен, почему вы называете это бедняжкой. Он поступает правильно, если вы хотите сделать свой процесс демоном, кроме того, он не отключается от управляющего терминала, что на практике не имеет значения. Во-вторых, вы называете это неправильно, правильная форма - (nohup sleep 20 &), то есть паренсы отключают его от лидера группы процессов, так что он не получает сигналов для этой группы процессов. - person Maxim Egorushkin; 04.10.2011
comment
@MaximYegorushkin Паренсы не имеют никакого значения (насколько я понимаю). Запуск любой программы из оболочки всегда делает эту программу лидером группы. Попробуйте это, и вы увидите, что PGID всегда совпадает с PID: perl -e 'system "ps -fjp $$"'. Кроме того, амперсанд не присущ nohup, поэтому даже в этом есть разница между nohup и daemon. Я собираюсь добавить свой собственный ответ с еще большим количеством различий. - person Kelvin; 18.01.2012
comment
@Kelvin: Скобки в (nohup sleep 20 &) действительно имеют значение. Они определяют суб-оболочку. Внутри суб-оболочки команда nohup выполняет команду sleep в фоновом режиме. Когда он возвращается, суб-оболочка завершает работу, поэтому sleep осиротел и больше не «принадлежит» текущей оболочке. - person Jonathan Leffler; 18.01.2012
comment
@JonathanLeffler Хорошо, теперь я вижу разницу - родительский PID равен 1, а не PID оболочки. Но я до сих пор не вижу разницы в том, чтобы стать лидером группы процессов. Он также по-прежнему является частью того же сеанса, поэтому он не полностью осиротел. В любом случае, паренсы не имеют отношения к различию nohup / daemon. - person Kelvin; 18.01.2012

Стать демоном

Эта ссылка содержит хороший список шагов, которые должен предпринять процесс, чтобы стать демоном:

https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

Я не могу скопировать список дословно из-за авторских прав (см. Раздел «О программе»), но вот краткое изложение:

  1. fork (в первый раз) - значит, мы не лидер группы и позволяем родителю уйти.
  2. call setsid() - стать лидером новой сессии. Этот призыв работает, только если мы не являемся лидером группы. У этого нового сеанса нет управляющего терминала.
  3. fork (второй раз) - значит, мы не являемся лидером сеанса (и, следовательно, не можем восстановить контролирующий терминал), и позволяем родительскому выходу.
  4. cd в корневой каталог - поэтому мы не препятствуем отключению других каталогов.
  5. установите umask на желаемое значение (необязательно) - потому что мы могли унаследовать маску, которая нам не нужна.
  6. закройте stdin, stdout, stderr (или просто откройте их заново, чтобы указать в другом месте)

nohup

Что делает nohup:

  • Если stdout и stderr подключены к терминалу, перенаправляет их на nohup.out
  • игнорирует SIGHUP

Сходства и различия

Обратите внимание, что единственными распространенными действиями являются перенаправление stdout и stderr. Чтобы быть демоном, даже не нужно игнорировать SIGHUP.

nohup не требует, чтобы вы использовали '&' для фона процесса - это означает, что вы все равно можете использовать ctrl-c для отправки SIGINT. Процесс по-прежнему реагирует на ввод с клавиатуры. Он также не изменяет стандартный ввод автоматически, поэтому рекомендуется сделать это самостоятельно с помощью "< /dev/null".

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

На практике

С точки зрения практичности, когда вы хотите запустить одноразовый длительный процесс, который должен продолжаться при выходе из оболочки, вы захотите использовать nohup, но вы также захотите объединить его с фоновым режимом и перенаправлением stdin. Одноразовое задание не стоит создавать демона, но некоторые свойства демона все еще могут быть полезны с заданием nohup, например "cd /".

Периодические задачи по регулярному расписанию лучше всего запускать через cron (или какой-либо другой планировщик).

Демоны лучше всего подходят для наблюдения за повторяющимися задачами, у которых нет предсказуемого времени начала. Обычно для процесса демона нет определенного времени окончания (он явно остановлен пользователем / другим процессом или завершением работы системы). Часто демоны - это службы, которые реагируют на приложения (клиенты) или другие условия (например, входящие данные через устройство ввода-вывода через unix select ()). Другие демоны опрашивают условие и в ответ выполняют действие.

Приложение об управлении терминалом

См. эту страницу. Вкратце, управляющий терминал предоставляет неограниченный доступ к своим stdin, stdout, stderr. Только одна группа процессов может иметь доступ к стандартному вводу. По умолчанию группы фоновых процессов также могут писать в stdout и stderr.

Кроме того, похоже, что сигналы клавиатуры, отправляемые на терминал, отправляются только группе процессов, которая имеет его в качестве управляющего терминала.

person Kelvin    schedule 18.01.2012
comment
Ваша ссылка на steve.org.uk не работает. - person QED; 16.01.2018

В вариантах UNIX процесс связан с конечным процессом (оболочкой входа в систему). Таким образом, когда завершается процесс терминала, он также останавливается из-за этой связи. Nohup предотвращает завершение процесса при остановке терминала.

Демон или демон - это процесс, который запускается системой при запуске, он работает до завершения работы, ни один пользователь не запрашивал его явно. Таким образом, по определению это не часть взаимодействия с пользователем, а принадлежит системе.

Если у вас есть доступ к системе как пользователь, вы можете использовать nohup. Если вы системный администратор, вы можете установить процесс демона. Для процесса это не имеет значения.

person Bruno Ranschaert    schedule 05.06.2009
comment
+1 Стою поправился. Перепутано между демоном и фоновым процессом (&). :) - person pugmarx; 06.06.2009
comment
Почти верно. Когда контролирующий процесс (лидер группы) завершает работу, всем процессам в группе отправляется SIGHUP, за которым, возможно, следует SIGCONT. - person Maxim Egorushkin; 04.10.2011
comment
Некоторые исправления: демон не обязательно должен быть системным процессом; непривилегированный пользователь может запускать демон. Пользователь может взаимодействовать с демоном, но не через сигналы терминала и потоки ввода-вывода (например, веб-сервер). Демоны можно запустить практически в любое время; они не ограничиваются загрузкой системы. - person Kelvin; 18.01.2012

Демон не может быть запущен, в то время как nohup инициируется пользователем.

person swarna    schedule 10.08.2010