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


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

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

4 52

4 ответа:

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

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

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

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

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

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

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

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

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 в корневой каталог -- поэтому мы не запрещаем другим каталогам быть umount-ed.
  5. set umask на нужное значение (необязательно) -- потому что мы могли унаследовать маску, которую не хотели.
  6. закройте stdin, stdout, stderr (или просто откройте их, чтобы указать в другом месте)

команды nohup

что nohup тут:

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

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

обратите внимание, как только общие действия перенаправление stdout и stderr. Чтобы быть демоном, даже не нужно игнорировать вздох.

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

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

На Практике

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

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

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

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

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

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

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

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

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

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