В чем разница между nohup и демоном? - PullRequest
54 голосов
/ 06 июня 2009

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

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

Ответы [ 4 ]

69 голосов
/ 06 июня 2009

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

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

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

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

Вы можете посмотреть Расширенное программирование в среде Unix, 3-е Эдн У Ричарда Стивенса и Стивена А Раго или Расширенное программирование Unix, 2-й Эдн Марка Дж. Рочкинда для обсуждение демонизации.

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

42 голосов
/ 18 января 2012

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

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

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

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

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

поЬир

Что nohup делает:

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

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

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

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

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

На практике

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

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

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

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

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

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

8 голосов
/ 06 июня 2009

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

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

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

0 голосов
/ 10 августа 2010

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

...