Поиск в Google показывает фрагменты кода x2. Первым результатом является этот рецепт кода, который содержит много документации и объяснений, а также несколько полезных обсуждений ниже.
Однако, другой пример кода, хотя и не содержащий такого большого количества документации, включает пример кода для передачи таких команд, как start, stop и restart . Он также создает PID-файл, который может быть удобен для проверки, запущен ли уже демон и т.д.
Оба этих примера объясняют, как создать демона. Есть ли какие-то дополнительные моменты, которые необходимо учитывать? Один пример лучше другого и почему?
Пример кода Сандера Марешаля превосходит оригинал, который был первоначально опубликован в 2004 году. Когда-то я создавал демонизатор для Pyro, но, вероятно, использовал бы код Сандера, если бы мне пришлось делать это заново.
установите 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
Обратите внимание, что вам понадобится python-daemon библиотека. Вы можете установить ее с помощью:
pip install python-daemon
Затем просто запустите его с помощью ./howdy.py start и остановите с помощью ./howdy.py stop.
Ответ 4
Альтернатива - создайте обычную, недемонизированную программу на Python, затем демонизируйте ее извне, используя supervisor. Это может избавить от множества головных болей и является переносимым на * nix и язык.