2015-05-23 10 views
4

Я пытаюсь сделать daemon в python, и я столкнулся с пакетом python-daemon. Интересная вещь об этом является то, что наиболее распространенным способом я видел раньше даже не то, что documentation, что очень редко, говорит вам, чтобы сделатьКак вы используете python-daemon так, как это диктует документация?

import os 
import grp 
import signal 
import daemon 
import lockfile 

from spam import (
    initial_program_setup, 
    do_main_program, 
    program_cleanup, 
    reload_program_config, 
    ) 

context = daemon.DaemonContext(
    working_directory='/var/lib/foo', 
    umask=0o002, 
    pidfile=lockfile.FileLock('/var/run/spam.pid'), 
    ) 

context.signal_map = { 
    signal.SIGTERM: program_cleanup, 
    signal.SIGHUP: 'terminate', 
    signal.SIGUSR1: reload_program_config, 
    } 

mail_gid = grp.getgrnam('mail').gr_gid 
context.gid = mail_gid 

important_file = open('spam.data', 'w') 
interesting_file = open('eggs.data', 'w') 
context.files_preserve = [important_file, interesting_file] 

initial_program_setup() 

with context: 
    do_main_program() 

Вместо этого, люди используют это так:

#!/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() 

Примеры here и в этой теме How do you create a daemon in Python?

так может кто-нибудь сказать мне, как предполагается, чтобы пакет был использован по назначению? Найдены 0 примеров, которые используют его так, как указано в документации.

+0

Я обновил его до более сложного примера только для вас, но это та же концепция в конце дня. У вас есть ответ, как правильно его использовать? – m0meni

+0

Это просто неправда. У меня установлена ​​версия 2.0.5, и она находится здесь: '/ usr/local/lib/python2.7/dist-packages/daemon/runner.py' – m0meni

+0

Точно, я рассматриваю вопрос с 2009 года, и я смущен, поэтому я сделал это. Документация мне не совсем понятна. Вы, похоже, хорошо разбираетесь в этой теме, не могли бы вы привести пример того, как реально использовать пакет, поскольку он предназначен для использования? – m0meni

ответ

10

Во-первых, причина, по которой вы не можете найти хорошую документацию, заключается в том, что, насколько мне известно, никто ее не писал. Когда Бен Финни предложил PEP, было много интереса, но потом, когда он попросил кого-то другого взять на себя проект и защитить его, никто не сделал этого, поэтому ... за пределами PEP и редкой документации в каталоге документов проекта , нет ничего, кроме источника для объяснения вещей.

A DaemonContext - это способ создания демона. Его API был широко распространен и был единственной частью, которая была предложена для участия в публичном интерфейсе в stdlib. В первоначальном обсуждении участвовали люди из проектов Debian, Ubuntu и RedHat/Fedora, и изменения были внесены на основе их опыта перемещения своих дистрибутивов на systemd.

A DaemonRunner обертывает a DaemonContext -это демон и инструмент управления (ala apachectl). Это реализует «сервис», который является только одним способом запуска демона из многих других способов.

Часто вы не хотите этого, если вы хотите построить «сервис», вы обычно хотите реализовать только демон с помощью daemon.DaemonContext, и пусть systemd или launchd или их старшие предшественники управлять службой, вызывая, что демон. Итак, PEP, чтобы держать вещи простыми, прямо сказал, что служба выходит за рамки того, что должен делать модуль daemon.

Но есть код для услуг в распределении python-daemon. Он не полностью задокументирован, потому что это всего лишь один из примеров использования демона.

Он действительно работает, и он определенно поддерживается и обновляется на протяжении многих лет. Итак, если вам нужен инструмент типа apachectl, я думаю, что имеет смысл использовать DaemonRunner; просто убедитесь, что вы читаете docstrings и пишите несколько тестов, чтобы убедиться, что они делают то, что вы хотели.

+1

К сожалению, DaemonRunner будет устаревшим: это новая разработка примерно 2 недели назад. https://pagure.io/python-daemon/c/f25678cacc8cd1fbb8a28c196e8fe2eed291146c?branch=master У меня есть пример, который использует стандартный модуль протоколирования, а также модуль pidfile, входящий в демон, плюс сценарий инициализации. См. Ответ здесь: http://stackoverflow.com/a/40536099/299952 –

3

Как abarnert says, документация python-daemon предназначена для того, чтобы показать, как писать процесс демона: программа, которая отделяется от управляющего терминала и не имеет родительского процесса и работает в фоновом режиме.

Код python-daemon не определяет, как использовать этот демон в службе. Для осуществления службы вам нужно что-то запустить этого демона: systemd, init, upstart, launchd все могут выполнить эту работу.

В качестве примера (недокументированного) база кода python-daemon содержит простой примерный бегун. Это не часть написания демона, а лучшие инструменты существуют.

Напишите демон с использованием API daemon.daemon, как задокументировано, и запустите его, используя бегун, который поставляется с вашей операционной системой.

 Смежные вопросы

  • Нет связанных вопросов^_^