Question

J'ai un outil que je l'ai écrit en python et doit généralement être exécuté comme un démon. Quelles sont les meilleures pratiques pour le conditionnement de cet outil pour la distribution, en particulier la façon dont les fichiers doivent paramètres et l'exécutable / script démon manipuler?

Dans le même ordre sont-il des outils communs pour la mise en place du démon pour exécuter au démarrage en fonction de la plate-forme donnée (ie init scripts sur linux, les services sur les fenêtres, launchd sur os x)?

Était-ce utile?

La solution

Pour répondre à une partie de votre question, il n'y a pas d'outils que je connais qui fera l'installation démon portably même à travers les systèmes Linux et encore moins Windows ou Mac OS X.

La plupart des distributions Linux semblent utiliser start-stop-daemon dans les scripts d'initialisation maintenant, mais vous allez encore avoir des différences mineures dans la mise en page du système de fichiers et de grandes différences dans l'emballage. En utilisant les autotools / configurer ou distutils / easy_install si votre projet est tout Python, ira un long chemin à rendre plus facile de construire des paquets pour différentes distributions Linux / BSD.

Windows est un jeu tout à fait différent et il faudra extensions win32 de Mark Hammond et peut-être extensions WMI Tim or.

Je ne sais pas Launchd, sauf que « aucune de ces » sont pertinents.

Pour obtenir des conseils sur daemonizing scripts Python, je chercherais à des applications Python que sont en train de faire dans le monde réel, par exemple à l'intérieur Twisted.

Autres conseils

Le meilleur outil que je trouve pour aider avec les scripts d'initialisation est « start-stop-daemon ». Il fonctionnera toute application, les fichiers de fonctionnement / pid, les créer au besoin, fournir des moyens pour arrêter le démon, le processus mis utilisateur / GID, et peut même arrière-plan de votre processus.

Par exemple, ceci est un script qui peut démarrer / arrêter un serveur wsgi:

#! /bin/bash

case "$1" in
  start)
    echo "Starting server"

    # Activate the virtual environment
    . /home/ali/wer-gcms/g-env/bin/activate

    # Run start-stop-daemon, the $DAEMON variable contains the path to the
    # application to run
    start-stop-daemon --start --pidfile $WSGI_PIDFILE \
        --user www-data --group www-data \
        --chuid www-data \
        --exec "$DAEMON"
    ;;
  stop)
    echo "Stopping WSGI Application"

    # Start-stop daemon can also stop the application by sending sig 15
    # (configurable) to the process id contained in the run/pid file
    start-stop-daemon --stop --pidfile $WSGI_PIDFILE --verbose
    ;;
  *)
    # Refuse to do other stuff
    echo "Usage: /etc/init.d/wsgi-application.sh {start|stop}"
    exit 1
    ;;
esac

exit 0

Vous pouvez également y voir un exemple de la façon de l'utiliser avec un virtualenv, que je recommande toujours.

Il y a beaucoup de bribes sur l'offre Internet pour écrire un démon en python pur (pas de scripts bash)

http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python / l'air propre ...

Si vous voulez écrire votre propre,
le principe est le même que la fonction démon bash.

En gros:

Démarrage rapide:

  • vous la fourchette à un autre processus
  • ouvrir un fichier journal pour rediriger votre stdout et stderr
  • Enregistrer quelque part le pid.

arrêt:

  • Vous envoyez SIGTERM au processus avec pid stocké dans votre pidfile.
  • Avec signal.signal (signal.SIGTERM, sigtermhandler), vous pouvez lier un arrêt procédure au signal SIGTERM.

Je ne sais pas package largement utilisé faisant bien.

Vérifier le module démon de Ben Finney. Il a commencé à écrire un PEP ciblant 3.X python:

http://www.python.org/dev/peps/pep-3143 /

Mais une mise en œuvre est déjà disponible ici:

http://pypi.python.org/pypi/python-daemon/

Pas d'argent pour balle ce que vous demandez, mais consultez supervisord . Il gère tous les bits amusants des processus de gestion. Je l'utilise beaucoup dans un grand environnement de production. Aussi, il est écrit en Python!

Je ne me souviens pas où je l'ai téléchargé ... mais c'est le meilleur script daemonizing que je l'ai trouvé. Il fonctionne à merveille (sur Mac et Linux.) (Sauf comme daemonize.py)

import sys, os
def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
    # Perform first fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit first parent.
    except OSError, e:
        sys.stderr.write("fork #1 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # Decouple from parent environment.
    os.chdir("/")
    os.umask(0)
    os.setsid( )
    # Perform second fork.
    try:
        pid = os.fork( )
        if pid > 0:
            sys.exit(0) # Exit second parent.
    except OSError, e:
        sys.stderr.write("fork #2 failed: (%d) %sn" % (e.errno, e.strerror))
        sys.exit(1)
    # The process is now daemonized, redirect standard file descriptors.
    for f in sys.stdout, sys.stderr: f.flush( )
    si = file(stdin, 'r')
    so = file(stdout, 'a+')
    se = file(stderr, 'a+', 0)
    os.dup2(si.fileno( ), sys.stdin.fileno( ))
    os.dup2(so.fileno( ), sys.stdout.fileno( ))
    os.dup2(se.fileno( ), sys.stderr.fileno( ))

Dans votre script, vous le feriez simplement:

from daemonize import daemonize
daemonize()

Et vous pouvez également spécifier des endroits pour rediriger le stdio, err, etc ...

Sur les systèmes Linux, prend généralement soin de gestionnaire de paquets de (Portage pour Gentoo, Ubuntu pour Aptitudes / Debian, Fedora yum pour, etc.), le système d'installation du programme, y compris en plaçant les scripts d'initialisation dans les bons endroits. Si vous souhaitez distribuer votre programme pour Linux, vous voudrez peut-être se pencher sur la vente liée en place dans le format approprié pour les différents gestionnaires de paquets de distributions.

Ce conseil est manifestement dénuée de pertinence sur les systèmes qui n'ont pas les gestionnaires de paquets (Windows, Mac et je pense).

fait clair pour moi que il y a en fait deux façons communes d'avoir votre exécution du programme Python comme deamon (je ne l'avais pas compris cela si clairement des réponses existantes):

  

Il existe deux approches pour l'écriture d'applications comme les serveurs démon   en Python.

     
      
  • La première est de gérer toutes les tâches de sarting et   arrêt daemons dans le code Python lui-même . La façon de faire est plus facile ce   avec le package python-daemon qui pourrait éventuellement faire son chemin   dans la distribution Python.
  •   

de réponse Poeljapon est un exemple de cette approche 1ère, bien qu'il n'utilise pas le paquet python-daemon, mais des liens vers une coutume mais script python très propre.

  
      
  • L'autre approche consiste à utiliser les outils   fourni par le système d'exploitation . Dans le cas de Debain, cela signifie   écrire un script d'initialisation qui utilise la start-stop-daemon   programme.
  •   

réponse Ali Afshar est un exemple de script shell de la 2ème approche, en utilisant le start-stop-daemon.

L'entrée de blog, je citais a un exemple de script shell, et quelques détails supplémentaires sur des choses telles que le démarrage de votre démon au démarrage du système et de redémarrer votre démon automatiquement quand il est arrêté pour une raison quelconque.

me corriger si mal, mais je crois que la question est de savoir comment répartir le démon. Définissez votre application à installer via pip puis faire le entry_point un cli(daemon()). Ensuite, créez un script d'initialisation qui fonctionne simplement $app_name &

"devrait généralement être exécuté comme un démon?"

Ne pas - sur la surface - faire beaucoup de sens. « En général » n'est pas sensible. Il est soit un démon ou non. Vous pouvez mettre à jour votre question.

Pour des exemples de daemons, lire sur daemons comme httpd d'Apache ou de tout serveur de base de données (ils sont daemons) ou le démon de messagerie SMTPD.

Ou, peut-être, lire sur quelque chose de simple, comme le démon FTP, démon SSH, Telnet démon.

Dans le monde Linux, vous aurez votre répertoire d'installation de l'application, un répertoire de travail, ainsi que les répertoires de fichiers de configuration.

Nous utilisons /opt/ourapp pour l'application (il est Python, mais nous ne pas installer dans lib/site-packages Python)

Nous utilisons /var/ourapp pour les fichiers de travail et nos fichiers de configuration.

Nous pourrions utiliser /etc/ourapp pour les fichiers de configuration - il serait cohérent -. Mais nous ne le faisons pas

Nous ne sommes pas - encore - utiliser les scripts init.d pour le démarrage. Mais c'est la dernière pièce, démarrage automatique. Pour l'instant, nous avons admins sys commencer les daemons.

Ceci est basé, en partie, sur http://www.pathname.com/fhs/ et http://tldp.org/LDP/ Linux-systèmefichiers hiérarchie / html / Linux-systèmefichiers Hierarchy.html .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top