239 votes

Comment créer un démon en Python?

D'une recherche sur Google révèle x2 extraits de code. Le premier résultat est à présent code recette qui a beaucoup de documentation et d'explication, de même que certains des discussions utiles dessous.

Cependant, un autre exemple de code, tout en ne contenant pas tellement de la documentation, inclut un exemple de code pour passer des commandes telles que démarrer, arrêter et redémarrer. Il crée également un fichier PID qui peuvent être utiles pour vérifier si le démon est déjà en cours d'exécution, etc.

Ces échantillons à la fois expliquer comment créer le démon. Il a des choses qui doivent être pris en considération? Est un exemple de mieux que les autres, et pourquoi?

162voto

bignose Points 6573

Il y a beaucoup de fiddly choses pour prendre soin de quand devient un bien comportés processus de démon:

  • prévenir core dumps (plusieurs démons exécuter en tant que root, et les vidages mémoire peut contenir des informations sensibles)

  • se comporter correctement à l'intérieur d'un chroot gaol

  • set UID, GID, répertoire de travail, umask, et d'autres paramètres du processus de manière appropriée pour le cas d'utilisation

  • renoncer élevées suid, sgid privilèges

  • fermer tous les descripteurs de fichiers ouverts, avec des exclusions selon le cas d'utilisation

  • se comporter correctement si on commence à l'intérieur d'un déjà-détachée du contexte, comme l' init, inetd, etc.

  • configurer les gestionnaires de signaux pour mieux démon de comportement, mais avec des gestionnaires déterminé par le cas d'utilisation

  • rediriger le flux standard stdin, stdout, stderr depuis un démon n'a plus un terminal de contrôle

  • gérer un fichier PID comme une coopérative consultatif de la serrure, qui est un ensemble de vers dans de nombreux contradictoires mais qui valide les façons de se comporter

  • permettre un nettoyage convenable lorsque le processus est terminé

  • en fait devenu un démon, sans mener à des zombies

Certains de ces sont standard, comme décrit dans canonique Unix littérature (Advanced Programming in the UNIX Environment, à la fin de W. Richard Stevens, Addison-Wesley, 1992). D'autres, tels que les flux de redirection et de de fichier PID de manutention, sont classiques comportement de la plupart démon utilisateurs pourrait s'attendre, mais qui sont moins standardisés.

Tous ces éléments sont couverts par le PEP 3143 "Standard" daemon " bibliothèque de processus," spécification et le python-démon de référence de mise en œuvre.

162voto

Jeff Bauer Points 6598

L' exemple de code de Sander Marechal est supérieur à l'original, qui a été publié en 2004. J'ai déjà fourni un démoniseur pour Pyro, mais j'utiliserais probablement le code de Sander si je devais le faire.

95voto

Dustin Kirkland Points 1404

Voici ma base de 'Bonjour le Monde' Python démon que j'avais au début, quand je suis à l'élaboration d'un nouveau démon de l'application. Notez que cela dépend de python-démon de la bibliothèque, qui fonctionne très bien en python2, mais n'est pas encore prise en charge dans python3.

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

Notez que vous aurez besoin de l' python-deaemon bibliothèque. Dans Ubuntu, vous:

sudo apt-get install python-daemon

Ensuite, il suffit de le lancer avec ./howdy.py start, et l'arrêter avec ./howdy.py stop.

42voto

Viliam Points 2219

Remarque le python-démon paquet qui résout beaucoup de problèmes à l'origine des démons hors de la boîte.

Parmi les autres caractéristiques, il permet d' (à partir du paquet Debian description):

  • Détacher le processus dans son propre processus de groupe.
  • Définir des processus de l'environnement approprié pour l'exécution de l'intérieur du chroot.
  • Renoncer à suid et sgid privilèges.
  • Fermer tous les descripteurs de fichiers ouverts.
  • Changer le répertoire de travail, uid, gid, et umask.
  • Fixer des gestionnaires de signaux.
  • Ouvrir de nouveaux descripteurs de fichiers pour stdin, stdout, et stderr.
  • Gérer un PID spécifié fichier de verrouillage.
  • Registre de nettoyage de fonctions à la sortie du traitement.

32voto

Chris Johnson Points 2887

Une alternative - créer un programme Python normale, non-daemon puis daemonize extérieurement à l'aide de supervisord ou un utilitaire similaire. Cela peut sauver beaucoup de maux de tête, et est * nix- et langage portable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X