Поиск в Google показывает фрагменты кода x2. Первый результат к этому рецепту кода, который имеет много документации и объяснений, а также некоторые полезные обсуждения ниже.
Тем не менее, другой пример кода , хотя и не содержит так много документации, включает пример кода для передачи таких команд, как запуск, остановка и перезапуск. Он также создает PID-файл, который может быть полезен для проверки, запущен ли демон и т. Д.
Оба примера объясняют, как создать демон. Есть ли какие-то дополнительные вещи, которые необходимо учитывать? Один образец лучше другого и почему?
Ответы:
Текущее решение
Эталонная реализация PEP 3143 (Стандартная библиотека процессов демона) теперь доступна как python-daemon .
Исторический ответ
Пример кода Sander Marechal превосходит исходный, который был первоначально опубликован в 2004 году. Однажды я предоставил демонизатор для Pyro, но, вероятно, использовал бы код Sander, если бы мне пришлось делать это заново.
источник
http://pypi.python.org/pypi/python-daemon
. Более надежный. Только один пример: попробуйте запустить один и тот же демон два разаpython-daemon
: большая ужасная ошибка. С кодом Сандера: приятное замечание «Демон уже работает».quit()
метод, который выполняется до остановки демона. Вот.Есть много интересных вещей, о которых нужно позаботиться, когда вы станете хорошим демоном :
предотвращение дампов ядра (многие демоны запускаются от имени root, а дампы ядра могут содержать конфиденциальную информацию)
вести себя правильно в
chroot
тюрьмеустановить UID, GID, рабочий каталог, umask и другие параметры процесса соответственно для варианта использования
отказаться от повышенных
suid
,sgid
привилегиизакройте все дескрипторы открытых файлов, с исключениями в зависимости от варианта использования
правильно вести себя , если началась внутри уже отдельностоящий контексте, например
init
,inetd
и т.д.установить обработчики сигналов для разумного поведения демона, а также с определенными обработчиками, определяемыми сценарием использования
не перенаправлять стандартные потоки
stdin
,stdout
,stderr
так как процесс демона больше не имеет контрольный терминалобрабатывать PID-файл как совместную консультативную блокировку, которая сама по себе представляет собой червь с множеством противоречивых, но обоснованных способов поведения
разрешить надлежащую очистку после завершения процесса
на самом деле стать процессом демона, не приводя к зомби
Некоторые из них являются стандартными , как описано в канонической литературе по Unix ( Расширенное программирование в среде UNIX , покойный У. Ричард Стивенс, Аддисон-Уэсли, 1992). Другие, такие как перенаправление потоков и обработка файлов PID , являются обычным поведением , которого ожидают большинство пользователей-демонов, но они менее стандартизированы.
Все они подпадают под спецификацию PEP 3143 «Стандартная библиотека процессов демона» . Реализация ссылок на python-daemon работает на Python 2.7 или более поздней версии и Python 3.2 или более поздней.
источник
Вот мой базовый демон Python 'Howdy World', с которого я начинаю, когда разрабатываю новое приложение-демон.
Обратите внимание, что вам понадобится
python-daemon
библиотека. Вы можете установить его:Тогда просто начни с
./howdy.py start
и прекрати./howdy.py stop
.источник
daemon
модуль, который вы импортируете, не является стандартной частью Python (пока). Это должно быть установлено сpip install python-daemon
или эквивалентным.Обратите внимание на пакет python-daemon , который решает множество проблем за демонами из коробки.
Среди других возможностей, которые он позволяет (из описания пакета Debian):
источник
Альтернатива - создать обычную недемонизированную программу Python, а затем внешне ее демонизировать с помощью supervisord . Это может сэкономить много головной боли и является переносимым * nix- и языком.
источник
Возможно, это не прямой ответ на вопрос, но systemd можно использовать для запуска приложения в качестве демона. Вот пример:
Я предпочитаю этот метод, потому что большая часть работы сделана для вас, и тогда ваш скрипт-демон работает так же, как и вся ваша система.
-Orby
источник
systemctl start control.service
YapDi - это относительно новый Python-модуль, который появился в Hacker News. Выглядит довольно полезно, может использоваться для преобразования скрипта Python в режим демона изнутри скрипта.
источник
так как python-daemon еще не поддерживает python 3.x, и из того, что можно прочитать в списке рассылки, он никогда не будет, я написал новую реализацию PEP 3143: pep3143daemon
pep3143daemon должен поддерживать как минимум Python 2.6, 2.7 и 3.x
Он также содержит класс PidFile.
Библиотека зависит только от стандартной библиотеки и от шести модулей.
Это может быть использовано как замена для python-daemon.
Вот документация .
источник
Эта функция преобразует приложение в демон:
источник
Боюсь, модуль демона, упомянутый @Dustin, не работал для меня. Вместо этого я установил python-daemon и использовал следующий код:
Бег легко
просто для полноты вот каталог содержимого samplemodule
Содержимое moduleclass.py может быть
источник
Еще одна вещь, о которой стоит подумать при демонизации в python:
Если вы используете ведение журнала Python и хотите продолжать использовать его после демонизации, обязательно вызовите
close()
обработчики (особенно обработчики файлов).Если вы этого не сделаете, обработчик все еще может думать, что у него открыты файлы, и ваши сообщения просто исчезнут - другими словами, убедитесь, что регистратор знает, что его файлы закрыты!
Это предполагает, что когда вы демонизируете, вы закрываете ВСЕ дескрипторы открытого файла без разбора - вместо этого вы можете попробовать закрыть все, кроме файлов журналов (но обычно проще закрыть все, а затем снова открыть те, которые вы хотите).
источник
Хотя вы можете предпочесть чистое решение Python, предоставляемое модулем python-daemon , в BSD и Linux есть
daemon(3)
функция, которая,libc
по крайней мере, будет работать правильно.Вызвать его из python легко:
Осталось только создать (и заблокировать) PID-файл. Но с этим ты справишься сам ...
источник
Я изменил несколько строк в образце кода Сандера Марешала (упомянутого @JeffBauer в принятом ответе ), чтобы добавить
quit()
метод, который выполняется до остановки демона. Это иногда очень полезно.Вот.
Примечание: я не использую модуль "python-daemon", потому что документация все еще отсутствует (см. Также много других вопросов SO) и довольно неясна (как правильно запустить / остановить демон из командной строки с этим модулем?)
источник
После нескольких лет и многих попыток (я попробовал все ответы, приведенные здесь, но все они имели незначительные недостатки в конце), теперь я понимаю, что есть лучший способ, чем запуск, остановка, перезапуск демона непосредственно из Python : используйте вместо этого инструменты ОС.
Например, для Linux вместо того, чтобы делать
python myapp start
иpython myapp stop
, я делаю это, чтобы запустить приложение:или
screen -dmS myapp python myapp.py
для запуска и отсоединить его в одной команде .Затем:
подключить к этому терминалу снова. Оказавшись в терминале, можно использовать CTRL + C, чтобы остановить его.
источник
Самый простой способ создания демона с помощью Python - это использование Twisted- событийной среды. Он обрабатывает все вещи, необходимые для демонизации для вас. Он использует шаблон Reactor для обработки одновременных запросов.
источник
В 80% случаев, когда люди говорят «демон», им нужен только сервер. Поскольку вопрос в этом вопросе совершенно неясен, трудно сказать, какой может быть область возможных ответов. Поскольку сервер адекватен, начните с него. Если фактический «демон» действительно нужен (это редко), читайте
nohup
как способ демонизации сервера.До тех пор, пока фактический демон фактически не требуется, просто напишите простой сервер.
Также посмотрите на справочную реализацию WSGI .
Также посмотрите на простой HTTP-сервер .
«Есть ли какие-то дополнительные вещи, которые необходимо учитывать?» Да. Около миллиона вещей. Какой протокол? Сколько запросов? Как долго обслуживать каждый запрос? Как часто они будут приезжать? Будете ли вы использовать выделенный процесс? Потоки? Подпроцессы? Написание демона - большая работа.
источник
fork()
, не говоря уже о двух. Они не имеют ничего общего с демонизацией.crond
илиsyslogd
выполняет служебные услуги для всей системы. Чтобы создать процесс демона, необходимо, по крайней мере, выполнить двойную операцию -fork()
со всеми закрытыми дескрипторами файлов, так что он неуязвим для сигналов от всех управляющих терминалов, включая системную консоль. Смотри бигнозный ответ.SimpleHTTPServer
это действительно сервер, но тот, который изначально не знает, как демонизировать себя (вы можете, например, Ctrl-C).nohup
это утилита для демона наивного процесса - так что ваш nohupped сервер действительно как демон , и сервер, точно так , как вы утверждаете. Этот вопрос переполнения стека по существу спрашивал: «Как я могу реализоватьnohup
в Python?»nohup
это хороший инструмент, и я уберу свой голос -1, если вы просто перенесете эту полезную идею в свой фактический ответ. На самом деле, если вы упомянетеsupervisord
и как это также избавит автора от необходимости вести журналирование, запускать-останавливать сценарий и перезапускать регулирование, тогда я даже +1 вам. :)