La recherche sur Google révèle des extraits de code x2. Le premier résultat est à cette recette de code qui a beaucoup de documentation et d'explications, avec quelques discussions utiles en dessous.
Cependant, un autre exemple de code , bien qu'il ne contienne pas autant de 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 peut être pratique pour vérifier si le démon est déjà en cours d'exécution, etc.
Ces exemples expliquent tous deux comment créer le démon. Y a-t-il d'autres éléments à considérer? Un échantillon est-il meilleur que l'autre et pourquoi?
Réponses:
Solution actuelle
Une implémentation de référence de PEP 3143 (bibliothèque de processus de démon standard) est désormais disponible en tant que démon python .
Réponse historique
L' échantillon de code de Sander Marechal est supérieur à l'original, qui a été initialement publié en 2004. J'ai déjà contribué un démoniseur pour Pyro, mais j'utiliserais probablement le code de Sander si je devais le refaire.
la source
http://pypi.python.org/pypi/python-daemon
. Plus fiable. Un seul exemple: essayez de démarrer deux fois le même démon avecpython-daemon
: big ugly error. Avec le code de Sander: une belle notice "Daemon déjà en cours d'exécution".quit()
qui est exécutée avant l'arrêt du démon. C'est ici.Il y a beaucoup de choses délicates à prendre en compte lorsque vous devenez un processus démon bien comporté :
empêcher les vidages de mémoire (de nombreux démons s'exécutent en tant que root et les vidages de mémoire peuvent contenir des informations sensibles)
se comporter correctement à l'intérieur d'une
chroot
prisondéfinir l'UID, le GID, le répertoire de travail, l'umask et d'autres paramètres de processus de manière appropriée pour le cas d'utilisation
renoncer élevés
suid
,sgid
privilègesfermer tous les descripteurs de fichiers ouverts, avec des exclusions selon le cas d'utilisation
se comporter correctement si commencé dans un contexte déjà détaché, comme
init
,inetd
, etc.configurer des gestionnaires de signaux pour un comportement sensible des démons, mais aussi avec des gestionnaires spécifiques déterminés par le cas d'utilisation
rediriger les flux standards
stdin
,stdout
,stderr
depuis un processus démon ne comporte une borne de commandegérer un fichier PID comme un verrou consultatif coopératif, qui est un ensemble de vers en lui-même avec de nombreuses façons contradictoires mais valides de se comporter
permettre un nettoyage approprié à la fin du processus
devenir en fait un processus démon sans conduire à des zombies
Certains d'entre eux sont standard , comme décrit dans la littérature canonique Unix ( Advanced Programming in the UNIX Environment , par feu W. Richard Stevens, Addison-Wesley, 1992). D'autres, comme la redirection de flux et la gestion des fichiers PID , sont des comportements conventionnels auxquels la plupart des utilisateurs de démons s'attendent mais qui sont moins standardisés.
Tous ces éléments sont couverts par la spécification PEP 3143 «Standard daemon process library» . L' implémentation de référence python-daemon fonctionne sur Python 2.7 ou version ultérieure, et Python 3.2 ou version ultérieure.
la source
Voici mon démon Python «Howdy World» de base avec lequel je commence, lorsque je développe une nouvelle application démon.
Notez que vous aurez besoin de la
python-daemon
bibliothèque. Vous pouvez l'installer en:Il suffit ensuite de le démarrer avec
./howdy.py start
et de l'arrêter avec./howdy.py stop
.la source
daemon
module que vous importez n'est pas (encore) une partie standard de Python. Il doit être installé avecpip install python-daemon
ou équivalent.Notez le démon python paquet qui résout beaucoup de problèmes derrière les démons prêts à l'emploi.
Entre autres fonctionnalités, il permet (à partir de la description du paquet Debian):
la source
Une alternative - créez un programme Python normal, non démonisé, puis démonifiez-le en externe à l'aide de supervisord . Cela peut sauver beaucoup de maux de tête et est * nix et portable.
la source
Probablement pas une réponse directe à la question, mais systemd peut être utilisé pour exécuter votre application en tant que démon. Voici un exemple:
Je préfère cette méthode car une grande partie du travail est fait pour vous, puis votre script démon se comporte de la même manière que le reste de votre système.
-Orby
la source
systemctl start control.service
YapDi est un module python relativement nouveau qui est apparu dans Hacker News. Semble assez utile, peut être utilisé pour convertir un script python en mode démon depuis l'intérieur du script.
la source
puisque python-daemon n'a pas encore supporté python 3.x, et d'après ce qui peut être lu sur la liste de diffusion, il ne le sera peut-être jamais, j'ai écrit une nouvelle implémentation de PEP 3143: pep3143daemon
pep3143daemon devrait prendre en charge au moins python 2.6, 2.7 et 3.x
Il contient également une classe PidFile.
La bibliothèque ne dépend que de la bibliothèque standard et des six modules.
Il peut être utilisé en remplacement du démon python.
Voici la documentation .
la source
Cette fonction transformera une application en démon:
la source
Je crains que le module démon mentionné par @Dustin ne fonctionne pas pour moi. Au lieu de cela, j'ai installé python-daemon et utilisé le code suivant:
La course est facile
juste pour être complet, voici le contenu du répertoire samplemodule
Le contenu de moduleclass.py peut être
la source
Encore une chose à laquelle penser lors de la démonisation en python:
Si vous utilisez la journalisation python et que vous souhaitez continuer à l'utiliser après la démonisation, assurez-vous d'appeler
close()
les gestionnaires (en particulier les gestionnaires de fichiers).Si vous ne le faites pas, le gestionnaire peut toujours penser qu'il a des fichiers ouverts et vos messages disparaîtront simplement - en d'autres termes, assurez-vous que l'enregistreur sait que ses fichiers sont fermés!
Cela suppose que lorsque vous démonifiez, vous fermez TOUS les descripteurs de fichiers ouverts sans discrimination - à la place, vous pouvez essayer de fermer tous les fichiers sauf les fichiers journaux (mais il est généralement plus simple de tout fermer puis de rouvrir ceux que vous voulez).
la source
Bien que vous préfériez la solution Python pure fournie par le module python-daemon, il existe une
daemon(3)
fonction danslibc
- au moins, sur BSD et Linux - qui fera le bon choix.L'appeler depuis python est simple:
La seule chose qui reste à faire est la création (et le verrouillage) du fichier PID. Mais que vous pouvez gérer vous-même ...
la source
J'ai modifié quelques lignes dans l'exemple de code de Sander Marechal (mentionné par @JeffBauer dans la réponse acceptée ) pour ajouter une
quit()
méthode qui est exécutée avant l'arrêt du démon. C'est parfois très utile.C'est ici.
Remarque: je n'utilise pas le module "python-daemon" car la documentation est toujours manquante (voir aussi beaucoup d'autres questions SO) et est plutôt obscure (comment démarrer / arrêter correctement un démon depuis la ligne de commande avec ce module?)
la source
Après quelques années et de nombreuses tentatives (j'ai essayé toutes les réponses données ici, mais elles avaient toutes des inconvénients mineurs à la fin), maintenant je me rends compte qu'il y a une meilleure façon que de vouloir démarrer, arrêter, redémarrer un démon directement depuis Python : utilisez plutôt les outils du système d'exploitation.
Par exemple, pour Linux, au lieu de faire
python myapp start
etpython myapp stop
, je fais cela pour démarrer l'application:ou
screen -dmS myapp python myapp.py
pour le démarrer et le détacher en une seule commande .Ensuite:
à attacher à nouveau à ce terminal. Une fois dans le terminal, il est possible d'utiliser CTRL + C pour l'arrêter.
la source
La façon la plus simple de créer un démon avec Python est d'utiliser le framework Twisted événementiel. Il gère tous les éléments nécessaires à la démonisation pour vous. Il utilise le modèle de réacteur pour gérer les demandes simultanées.
la source
80% du temps, quand les gens disent "démon", ils ne veulent qu'un serveur. La question étant parfaitement floue sur ce point, il est difficile de dire quel pourrait être le domaine des réponses. Puisqu'un serveur est adéquat, commencez par là. Si un "démon" réel est réellement nécessaire (c'est rare), lisez la suite
nohup
comme moyen de démoniser un serveur.Jusqu'à ce qu'un véritable démon soit réellement requis, il suffit d'écrire un simple serveur.
Regardez également l' implémentation de référence WSGI .
Regardez également le serveur HTTP simple .
"Y a-t-il d'autres éléments à prendre en compte?" Oui. Environ un million de choses. Quel protocole? Combien de demandes? Combien de temps pour répondre à chaque demande? À quelle fréquence arriveront-ils? Allez-vous utiliser un processus dédié? Des discussions? Sous-processus? Écrire un démon est un gros travail.
la source
fork()
, et encore moins deux. Ils n'ont rien à voir avec la démonisation.crond
ousyslogd
- fait des services d'entretien pour l'ensemble du système. Pour créer un processus démon, il faut au moins effectuer un doublefork()
avec tous les descripteurs de fichiers fermés, de sorte que l'on soit à l'abri des signaux de tous les terminaux de contrôle, y compris la console système. Voir la réponse de bignose.SimpleHTTPServer
est en effet un serveur, mais qui ne sait pas se démonifier nativement (vous pouvez le Ctrl-C par exemple).nohup
est un utilitaire pour démoniser un processus naïf - donc votre serveur nohupped est en effet à la fois un démon et un serveur, exactement comme vous le prétendez. Cette question de débordement de pile demandait essentiellement: "Comment puis-je implémenternohup
en Python?"nohup
c'est un excellent outil, et je supprimerai mon vote -1 si vous déplacez simplement cette idée utile dans votre réponse réelle. En fait, si vous mentionnezsupervisord
et comment cela évitera également à l'auteur d'avoir à faire la journalisation, un script start-stop et à redémarrer la limitation, alors je vous attribuerai même +1. :)