Какая разница между nohup и демоном?

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

Я знаю, какая разница в терминах процессов forking и т.д., но какое влияние это оказывает на мой script?

Ответ 1

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

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

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

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

Вы можете посмотреть Расширенное программирование в среде Unix, 3rd Edn от W Richard Stevens и Stephen A Rago или в Advanced Unix Programming, 2nd Edn от Marc J Rochkind для обсуждения демонализации.

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

Ответ 2

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

В этой ссылке есть хороший список шагов, которые должен пройти процесс, чтобы стать демоном: http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

Я не могу скопировать список дословно из-за авторского права (см. раздел "О программе" ), но здесь резюме:

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

поЬир

Что nohup делает:

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

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

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

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

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

На практике

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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