Каковы последствия запуска script как демона в сравнении с использованием nohup?
Я знаю, какая разница в терминах процессов forking и т.д., но какое влияние это оказывает на мой script?
Каковы последствия запуска script как демона в сравнении с использованием nohup?
Я знаю, какая разница в терминах процессов forking и т.д., но какое влияние это оказывает на мой script?
Команда 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
, которая будет демонизировать программу, которая не знает, как ее самоопределить (правильно). Он был написан для устранения дефектов в программе, которая должна была демонизировать себя, но не работала должным образом. Свяжитесь со мной, если вы хотите - см. Мой профиль.
Стать демоном
В этой ссылке есть хороший список шагов, которые должен пройти процесс, чтобы стать демоном: http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
Я не могу скопировать список дословно из-за авторского права (см. раздел "О программе" ), но здесь резюме:
fork
(первый раз) - поэтому мы не являемся лидером группы, и пусть родительский выход.setsid()
- стать лидером нового сеанса. Этот вызов работает только в том случае, если мы не являемся лидером группы. Этот новый сеанс не имеет управляющего терминала.fork
(второй раз) - поэтому мы не являемся лидером сеанса (и, следовательно, не можем восстановить управляющий терминал), и пусть родительский выход.cd
в корневой каталог - поэтому мы не предотвращаем удаление других каталогов.umask
в желаемое значение (необязательно) - потому что мы могли бы унаследовать маску, которую мы не хотели.поЬир
Что nohup
делает:
nohup.out
Сходства и различия
Обратите внимание, что единственными распространенными действиями являются перенаправление 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.
Кроме того, похоже, что сигналы клавиатуры, отправленные на терминал, отправляются только в группу процессов, которая имеет в качестве управляющего терминала.
В вариантах UNIX процесс связан с терминальным процессом (оболочкой входа). Поэтому, когда терминальный процесс завершается, процесс также прекращается из-за этой связи. Nohup предотвращает выход из процесса, когда терминал останавливается.
Демон или демон - это процесс, который запускается системой при запуске, он работает до выключения, и пользователь не запрашивает его явно. Поэтому по определению он не является частью взаимодействия пользователя, а принадлежит системе.
Если у вас есть доступ к системе в качестве пользователя, вы можете использовать nohup. Если вы являетесь sysadmin, вы можете установить процесс deamon. Для процесса это не имеет значения.
Демон не может быть запущен, тогда как nohup инициируется пользователем.