Вопрос-Ответ

How do you create a daemon in Python?

Как создать демона на Python?

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

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

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

Переведено автоматически
Ответ 1

Текущее решение

Эталонная реализация PEP 3143 (Standard daemon process library) теперь доступна как python-daemon.

Исторический ответ

Пример кода Сандера Марешаля превосходит оригинал, который был первоначально опубликован в 2004 году. Когда-то я создавал демонизатор для Pyro, но, вероятно, использовал бы код Сандера, если бы мне пришлось делать это заново.

Ответ 2

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


  • предотвращение дампов ядра (многие демоны запускаются от имени root, а дампы ядра могут содержать конфиденциальную информацию)



  • правильно вести себя внутри chroot тюрьмы



  • установите UID, GID, рабочий каталог, umask и другие параметры процесса соответствующим образом для конкретного варианта использования



  • отказаться от повышенных suid, sgid привилегий



  • закройте все открытые файловые дескрипторы с исключениями в зависимости от варианта использования



  • ведет себя корректно, если запущен внутри уже отсоединенного контекста, такого как init, inetd и т.д.



  • настройте обработчики сигналов для разумного поведения демона, но также и с конкретными обработчиками, определяемыми вариантом использования



  • перенаправлять стандартные потоки stdin, stdout, stderr поскольку у процесса-демона больше нет управляющего терминала



  • обрабатывайте PID-файл как совместную консультативную блокировку, которая сама по себе является целой банкой червей со множеством противоречивых, но допустимых способов поведения



  • разрешить надлежащую очистку при завершении процесса



  • фактически стать демоническим процессом, не приводя к зомби



Некоторые из них являются стандартными, как описано в канонической литературе по Unix (Расширенное программирование в среде UNIX, покойный У. Ричард Стивенс, Аддисон-Уэсли, 1992). Другие, такие как перенаправление потока и обработка PID-файлов, являются обычным поведением, которое ожидает большинство пользователей daemon, но они менее стандартизированы.

Все это описано в спецификации PEP 3143 “Стандартная библиотека процессов-демонов”. Эталонная реализация python-daemon работает на Python 2.7 или более поздней версии и Python 3.2 или более поздней.

Ответ 3

Вот мой базовый демон Python "Howdy World", с которого я начинаю, когда разрабатываю новое демоническое приложение.

#!/usr/bin/python
import time
from daemon import runner

class App():
def __init__(self):
self.stdin_path = '/dev/null'
self.stdout_path = '/dev/tty'
self.stderr_path = '/dev/tty'
self.pidfile_path = '/tmp/foo.pid'
self.pidfile_timeout = 5
def run(self):
while True:
print("Howdy! Gig'em! Whoop!")
time.sleep(10)

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

Обратите внимание, что вам понадобится python-daemon библиотека. Вы можете установить ее с помощью:

pip install python-daemon

Затем просто запустите его с помощью ./howdy.py start и остановите с помощью ./howdy.py stop.

Ответ 4

Альтернатива - создайте обычную, недемонизированную программу на Python, затем демонизируйте ее извне, используя supervisor. Это может избавить от множества головных болей и является переносимым на * nix и язык.

python