Как создать демона в linux python
Поиск в Google показывает фрагменты кода x2. Первый результат - это рецепт кода , который имеет много документации и объяснений, а также некоторые полезные обсуждения внизу.
Однако другой пример кода, хотя и не содержит так много документации, включает в себя пример кода для передачи таких команд, как start, stop и restart. Он также создает файл PID, который может быть удобен для проверки того, работает ли демон уже и т. д.
Оба этих примера объясняют, как создать демона. Есть ли какие-то дополнительные вещи, которые необходимо учитывать? Является ли один образец лучше другого и почему?
Я пытаюсь создать поток демона в c++ для windows, используя собственные API, но, похоже, не могу найти никаких ссылок на потоки демона. Есть ли у кого-нибудь ссылка на документацию, относящуюся к этому, или есть другой термин для этого на windows? Как создать поток демона на windows в c++?
Текущее решение
Исторический ответ
Образец кода Сандера Марешаля превосходит оригинал, который был первоначально опубликован в 2004 году. Однажды я внес демонизатор для Pyro, но, вероятно, использовал бы код Сандера, если бы мне пришлось делать это заново.
Есть много вещей , о которых нужно позаботиться, когда вы становитесь хорошо управляемым процессом демона :
предотвращение дампов ядра (многие демоны работают от имени root, и дампы ядра могут содержать конфиденциальную информацию)
вести себя правильно в тюрьме chroot
установите UID, GID, рабочий каталог, umask и другие параметры процесса, соответствующие случаю использования
отказаться от повышенных привилегий suid , sgid
закройте все открытые файловые дескрипторы с исключениями в зависимости от варианта использования
ведите себя правильно, если запущено в уже отсоединенном контексте , таком как init , inetd и т. Д.
настройка обработчиков сигналов для разумного поведения демона, но также и с конкретными обработчиками, определяемыми вариантом использования
перенаправьте стандартные потоки stdin , stdout , stderr , так как процесс демона больше не имеет управляющего terminal
обрабатывайте файл PID как совместную консультативную блокировку, которая сама по себе представляет собой целую банку червей со многими противоречивыми, но допустимыми способами поведения
разрешить правильную очистку после завершения процесса
на самом деле стать процессом демона, не приводя к зомби
Некоторые из них являются стандартными , как описано в канонической литературе Unix ( Advanced Programming in the UNIX Environment , покойный У. Ричард Стивенс, Аддисон-Уэсли, 1992). Другие, такие как перенаправление потока и обработка файлов PID , являются обычным поведением , которое ожидало бы большинство пользователей демонов, но они менее стандартизированы.
Все они охвачены спецификацией PEP 3143 “Standard daemon process library” . Ссылочная реализация python-daemon работает на Python 2.7 или более поздней версии и Python 3.2 или более поздней версии.
Я пытаюсь создать сценарий python для запуска в качестве демона, и я сталкиваюсь с этой проблемой при попытке импортировать модель runner: Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) [GCC 4.4.5] on linux2 Type help, copyright, credits or license for more information. >>> from daemon.
Как я могу проверить процесс демона python? Я пытаюсь check process rane matching 147684802 start program = /usr/local/bin/python2.7 /root/rane.py 147684802 > /dev/null 2>&1 & Но он терпит неудачу с таймаутом для моего случая daemon-python. Спасибо!
Вот мой базовый демон 'Howdy World' Python, с которого я начинаю, когда разрабатываю новое приложение демона.
Обратите внимание, что вам понадобится библиотека python-daemon . Вы можете установить его с помощью:
Тогда просто начните с ./howdy.py start и остановите его с ./howdy.py stop .
Обратите внимание на пакет python-daemon , который решает множество проблем, стоящих за демонами из коробки.
Среди других функций он позволяет (из описания пакета Debian):
- Выделите процесс в его собственную группу процессов.
- Установите среду процесса, подходящую для работы внутри chroot.
- Откажитесь от привилегий suid и sgid.
- Закройте все открытые дескрипторы файлов.
- Измените рабочий каталог, uid, gid и umask.
- Установите соответствующие обработчики сигналов.
- Откройте новые файловые дескрипторы для stdin, stdout и stderr.
- Управление указанным файлом блокировки PID.
- Функции очистки регистров для обработки на выходе.
Альтернатива - создать нормальную, не демонизированную программу Python, а затем внешне демонизировать ее с помощью супервизора . Это может избавить от многих головных болей, а также является *nix- и переносимым языком.
Вероятно, это не прямой ответ на вопрос, но systemd можно использовать для запуска вашего приложения в качестве демона. Вот пример:
Я предпочитаю этот метод, потому что большая часть работы выполняется за вас, а затем ваш сценарий демона ведет себя аналогично rest вашей системы.
YapDi -это относительно новый модуль python, который появился в новостях хакеров. Выглядит довольно полезно, может использоваться для преобразования скрипта 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() для обработчиков (особенно обработчиков файлов).
Это предполагает, что при демонизации вы закрываете ALL открытых файловых дескрипторов без разбора - вместо этого вы можете попробовать закрыть все, кроме файлов журнала (но обычно проще закрыть все, а затем снова открыть те, которые вы хотите).
Хотя вы можете предпочесть чистое решение Python, предоставляемое модулем python-daemon, в libc есть функция daemon(3) - по крайней мере, на BSD и Linux -которая будет делать правильные вещи.
Позвонить ему из python очень просто:
Я изменил несколько строк в примере кода Сандера Марешаля (упомянутом @JeffBauer в принятом ответе), чтобы добавить метод quit() , который выполняется до остановки демона. Это иногда очень полезно.
Примечание: Я не использую модуль "python-daemon", потому что документация все еще отсутствует (см. Также многие другие вопросы SO) и довольно неясна (как правильно запустить/остановить демона из командной строки с помощью этого модуля?)
После нескольких лет и многих попыток (я перепробовал все ответы, приведенные здесь, но все они имели незначительные недостатки в конце), теперь я понимаю, что есть лучший способ, чем желание запускать, останавливать, перезапускать демона непосредственно из Python: вместо этого используйте инструменты OS.
Например, для Linux вместо python myapp start и python myapp stop я делаю это, чтобы запустить приложение:
или screen -dmS myapp python myapp.py , чтобы запустить и отсоединить его одной командой .
чтобы снова прикрепить к этому terminal. Попав в terminal, можно использовать CTRL+C, чтобы остановить его.
Самый простой способ создать демона с Python-использовать скрученную структуру, управляемую событиями. Он обрабатывает все вещи, необходимые для демонизации для вас. Он использует шаблон реактора для обработки параллельных запросов.
До тех пор, пока не потребуется реальный демон, просто напишите простой сервер.
Также посмотрите на реализацию ссылки WSGI .
"Есть ли какие-то дополнительные вещи, которые необходимо рассмотреть? "да. Около миллиона вещей. Какой протокол? Сколько запросов? Как долго нужно обслуживать каждый запрос? Как часто они будут приезжать? Будете ли вы использовать специальный процесс? Нити? Подпроцессы? Написание демона - это большая работа.
Похожие вопросы:
Я пытаюсь создать поток демона под Windows, но понятия не имею, что я делаю не так. Приведенный ниже код действует как обычный поток: я не вижу End run, записанного на консоль. Есть предложения? def.
У меня есть файл .py, который управляется: python a.py & Я использую ssh для выполнения команды, после чего я должен выйти из системы. Через некоторое время я обнаруживаю, что процесс завершен.
Кто-нибудь знает о работающей и хорошо документированной реализации демона, использующего python? Пожалуйста, разместите ссылку здесь, Если вы знаете проект, который соответствует этим двум.
Я пытаюсь создать поток демона в c++ для windows, используя собственные API, но, похоже, не могу найти никаких ссылок на потоки демона. Есть ли у кого-нибудь ссылка на документацию, относящуюся к.
Я пытаюсь создать сценарий python для запуска в качестве демона, и я сталкиваюсь с этой проблемой при попытке импортировать модель runner: Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40) [GCC.
Как я могу проверить процесс демона python? Я пытаюсь check process rane matching 147684802 start program = /usr/local/bin/python2.7 /root/rane.py 147684802 > /dev/null 2>&1 & Но он.
Я пытаюсь создать фоновую службу в Python. Служба будет вызвана из другой программы Python. Он должен работать как демонический процесс, потому что он использует тяжелый объект (300 МБ), который.
Кто-нибудь может сказать мне, как мы можем создать поток демона в Java? Я имею в виду синтаксис и то, как его можно использовать и изменять.
Если я создаю поток демона в Python (3.6+) и этот поток демона завершает выполнение, его ресурсы автоматически освобождаются или это утечка памяти? Я огляделся вокруг и не смог найти answer. I.
Поиск в Google показывает фрагменты кода x2. Первый результат - этот рецепт кода, который содержит много документации и пояснений, а также некоторые полезное обсуждение под.
Тем не менее, другой пример кода, хотя и не содержит так много документации, содержит пример кода для передачи таких команд, как начать, остановить и перезапустить. Он также создает PID-файл, который может быть полезен для проверки, запущен ли демон и т. Д.
Оба примера объясняют, как создать демон. Есть ли какие-то дополнительные вещи, которые необходимо учитывать? Один образец лучше другого и почему?
Текущее решение
Исторический ответ
Возможно, это не прямой ответ на вопрос, но systemd можно использовать для запуска приложения в качестве демона. Вот пример:
Я предпочитаю этот метод, потому что большая часть работы сделана для вас, и тогда ваш скрипт-демон работает так же, как и вся ваша система.
YapDi - это относительно новый модуль Python, который появился в Hacker News. Выглядит довольно полезно, может использоваться для преобразования скрипта Python в режим демона изнутри скрипта.
Вот мой базовый демон Python 'Howdy World', с которого я начинаю, когда разрабатываю новое приложение-демон.
Обратите внимание, что вам понадобится библиотека python-daemon . Вы можете установить его:
Затем просто начните с ./howdy.py start и остановите с ./howdy.py stop .
Альтернатива - создать обычную недемонизированную программу на Python, а затем внешне ее демонизировать, используя supervisord. Это может сэкономить много головной боли и является переносимым на * nix- и язык.
После нескольких лет и многих попыток (я попробовал все ответы, приведенные здесь, но все они имели незначительные недостатки в конце), теперь я понимаю, что есть лучший способ, чем запуск, остановка, перезапуск демона непосредственно из Python : используйте вместо этого инструменты ОС.
Например, для Linux вместо python myapp start и python myapp stop я делаю это для запуска приложения:
Или screen -dmS myapp python myapp.py чтобы запустить и отключить его одной командой.
Подключить к этому терминалу снова. Оказавшись в терминале, можно использовать CTRL + C, чтобы остановить его.
До тех пор, пока фактический демон фактически не требуется, просто напишите простой сервер.
«Есть ли какие-то дополнительные вещи, которые необходимо учитывать?» Да. Около миллиона вещей. Какой протокол? Сколько запросов? Как долго обслуживать каждый запрос? Как часто они будут приезжать? Будете ли вы использовать выделенный процесс? Потоки? Подпроцессы ? Написание демона - большая работа.
Самый простой способ создать демон с помощью Python - это использовать Twisted управляемую событиями среду. Он обрабатывает все вещи, необходимые для демонизации для вас. Он использует Шаблон Reactor для обработки одновременных запросов.
Есть много непростых вещей , о которых нужно позаботиться, став Процесс демона с хорошим поведением:
предотвращение дампов ядра (многие демоны запускаются от имени root, а дампы ядра могут содержать конфиденциальную информацию)
вести себя правильно внутри chroot тюрьмы
установить UID, GID, рабочий каталог, umask и другие параметры процесса соответственно для варианта использования
отказаться от повышенных suid , sgid привилегий
закройте все дескрипторы открытых файлов, с исключениями в зависимости от варианта использования
вести себя корректно, если он запущен в уже отсоединенном контексте, таком как init , inetd и т. д.
установить обработчики сигналов для разумного поведения демона, а также с определенными обработчиками, определенными в зависимости от варианта использования
обрабатывать PID-файл как совместную консультативную блокировку, которая представляет собой целое банку червей в себе со многими противоречивыми, но обоснованными способами поведения
разрешить надлежащую очистку после завершения процесса
фактически становится процессом демона, не приводя к зомби
Некоторые из них являются стандартными , как описано в канонической литературе по Unix ( Расширенное программирование в среде UNIX , покойным У. Ричардом Стивенсом, Addison-Wesley, 1992). Другие, такие как перенаправление потока и обработка файла PID Обычное поведение , которого ожидают большинство пользователей демонов, но они менее стандартизированы.
На все это распространяется PEP 3143 «Стандартная библиотека процессов демона». "спецификация . python-daemon справочная реализация работает на Python 2.7 или более поздней версии и Python 3.2 или более поздней версии ,
Читайте также: