Какая разница между 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 инициируется пользователем.