Как вы создаете демон в Python? - PullRequest
232 голосов
/ 23 января 2009

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

Тем не менее, другой пример кода , хотя и не содержит так много документации, содержит пример кода для передачи таких команд, как запуск, останов и перезапуск. Он также создает PID-файл, который может быть полезен для проверки, запущен ли демон и т. Д.

Оба примера объясняют, как создать демона. Есть ли какие-то дополнительные вещи, которые необходимо учитывать? Один образец лучше другого и почему?

Ответы [ 15 ]

2 голосов
/ 20 февраля 2014

Еще одна вещь, о которой стоит подумать при демонизации в python:

Если вы используете python logging и хотите продолжить использовать его после демонизации, обязательно вызовите close() на обработчиках (особенно на обработчиках файлов).

Если вы этого не сделаете, обработчик все еще может думать, что у него открыты файлы, и ваши сообщения просто исчезнут - другими словами, убедитесь, что регистратор знает, что его файлы закрыты!

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

1 голос
/ 12 ноября 2016

Я изменил несколько строк в примере кода Сандера Марешала (упомянутого @JeffBauer в принятый ответ ), чтобы добавить метод quit(), который выполняется до остановки демона. Это иногда очень полезно.

Вот оно.

Примечание: я не использую модуль "python-daemon", потому что документация все еще отсутствует (см. Также много других вопросов SO) и довольно неясна (как правильно запустить / остановить демон из командной строки с этим модулем?)

0 голосов
/ 23 февраля 2018

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

Например, для Linux вместо python myapp start и python myapp stop я делаю это для запуска приложения:

screen -S myapp python myapp.py    
CTRL+A, D to detach

или screen -dmS myapp python myapp.py до запустить и отключить его в одну команду .

Тогда:

screen -r myapp

для повторного подключения к этому терминалу. Оказавшись в терминале, можно использовать CTRL + C, чтобы остановить его.

0 голосов
/ 24 января 2009

Самый простой способ создания демона с Python - это использование управляемой событиями среды Twisted . Он обрабатывает все вещи, необходимые для демонизации для вас. Он использует Reactor Pattern для обработки одновременных запросов.

0 голосов
/ 24 января 2009

80% случаев, когда люди говорят "демон", им нужен только сервер. Поскольку вопрос в этом вопросе совершенно неясен, трудно сказать, какой может быть область возможных ответов. Поскольку сервер достаточно, начните с него. Если фактический «демон» действительно необходим (это редко), прочитайте nohup как способ демонизации сервера.

Пока фактический демон фактически не требуется, просто напишите простой сервер.

Также посмотрите на реализацию WSGI .

Также посмотрите на Простой HTTP-сервер .

«Есть ли какие-то дополнительные вещи, которые необходимо учитывать?» Да. Около миллиона вещей. Какой протокол? Сколько запросов? Как долго обслуживать каждый запрос? Как часто они будут приезжать? Будете ли вы использовать выделенный процесс? Потоки? Подпроцессы? Написание демона - большая работа.

...