Maintenir la connexion et/ou stdout/stderr en Python Démon
Chaque recette que j'ai trouvé pour la création d'un processus démon en Python implique de séparer en deux fois (pour Unix), puis de fermer tous les descripteurs de fichiers ouverts. (Voir http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ pour un exemple).
C'est tout assez simple, mais je semble avoir un problème. Sur la machine de production que je suis en train d'ouvrir, mon démon est l'abandon silencieuse depuis tous les descripteurs de fichiers ouverts ont été fermés. Je vais avoir un moment délicat de débogage de la question à l'heure actuelle et je me demande ce que la bonne façon de les attraper et de les connecter ces erreurs sont.
Quelle est la bonne façon de journalisation de l'installation telle qu'elle continue à travailler après daemonizing? Dois-je viens de l'appeler logging.basicConfig()
une seconde fois après daemonizing? Quelle est la bonne façon de capturer stdout
et stderr
? Je suis flou sur les détails de pourquoi tous les fichiers sont fermés. Idéalement, mon code principal pourrait simplement appeler daemon_start(pid_file)
et de journalisation continuera à travailler.
J'ai remarqué ce commentaire dans l'exploitation forestière docs: "Cette fonction ne fait rien si la racine de l'enregistreur a déjà des gestionnaires configurés pour elle." Si je veux la journalisation avant et après daemonizing, comment cela affecte la situation?
Si je suis correct, il est possible d'ajouter des gestionnaires/filtres après l'initialisation de l'enregistreur. Cela signifie que vous pourriez ajouter un FileHandler avant de démarrer le démon de contexte et d'en ajouter un autre, après le démarrage. Je ne suis pas entièrement sûr que cela fonctionne bien.
OriginalL'auteur dave mankoff | 2012-11-01
Vous devez vous connecter pour publier un commentaire.
- Je utiliser le
python-daemon
bibliothèque pour mon daemonization comportement.Interface décrite ici:
Mise en œuvre ici:
Il permet de spécifier une
files_preserve
argument, à indiquer tous les descripteurs de fichier qui devrait pas être fermé lorsque daemonizing.Si vous avez besoin de la journalisation via le même
Handler
cas avant et après daemonizing, vous pouvez:basicConfig
oudictConfig
ou quoi que ce soit.Handler
s dépendent. Malheureusement, cela dépend de laHandler
sous-classe. Si votre première installéHandler
est unStreamHandler
, c'est la valeur delogging.root.handlers[0].stream.fileno()
; si votre seconde installéHandler
est unSyslogHandler
, vous voulez que la valeur delogging.root.handlers[1].socket.fileno()
; etc. C'est le désordre 🙁DaemonContext
avecfiles_preserve
égale à une liste de descripteurs de fichiers vous avez déterminé à l'étape 3.Une autre solution pourrait être, comme @Exelian suggéré, afin de les utiliser différents
Handler
cas avant et après la daemonziation. Immédiatement après daemonizing, de détruire l'existant gestionnaires (pardel
ing delogger.root.handlers
?) et créer à l'identique de nouvelles; vous ne pouvez pas re-appelbasicConfig
en raison du problème que @dave-mankoff souligné.OriginalL'auteur Maxy-B
Vous pouvez simplifier le code pour cette option si vous configurez votre journalisation gestionnaire d'objets séparément à partir de la racine de votre enregistreur objet, puis ajouter le gestionnaire d'objets, comme un indépendant étape plutôt que de le faire tous en même temps. Le suivant devrait fonctionner pour vous.
context.close()
ou utiliser leswith
déclaration.OriginalL'auteur mpounsett
Nous avons juste eu un problème similaire, et en raison de certaines choses qui sont hors de mon contrôle, le démon des trucs, distincte de la substance de la création de l'enregistreur. Cependant, l'enregistreur a une .les gestionnaires et les .parent des attributs qui font qu'il est possible avec quelque chose comme:
c'est la façon la plus propre! merci!
OriginalL'auteur TommyTheKid