Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Comment transformer un programme python en daemon?

+6 votes

J'ai un programme python que j'aimerais transformer en daemon.
En gros, j'aimerais lancer mon programme et pouvoir fermer mon terminal sans killer le processus lié.

J'aimerais également pouvoir interagir avec ce daemon durant son exécution.

Par exemple:

monscript start
monscript stop
monscript www.sametmax.com

J'ai trouvé une librairie (python-daemon), mais qui n'a pas été mise à jour depuis 6 ans....pas convaincant donc.

Idéalement, une solution pouvant être implémentée en python2 et python3.

demandé 21-Avr-2016 par Cornoualis (184 points)

4 Réponses

+3 votes
 
Meilleure réponse

La solution de D. Beazley dans son python cookbook mérite d'être mentionnée ici. D'une part parce que c'est du pur python, et d'autre part parce qu'on comprend mieux les spécificités d'un daemon.

http://chimera.labs.oreilly.com/books/1230000000393/ch12.html#_solution_210

Pour ce qui est de pouvoir communiquer avec ton daemon, c'est une vaste question (voir ici). Basiquement, tu peux regarder du coté des pipes ou des sockets, mais si tu nous en disais un peu plus sur ton besoin on pourrait essayer d'envisager quelque chose de plus précis et adapté.

répondu 21-Avr-2016 par yoch (2,062 points)
sélectionné 22-Avr-2016 par Cornoualis

Ce besoin concerne plusieurs projets, mais en général, j'aimerais pouvoir utiliser les commandes basiques (stop/start/restart/status), mais aussi des commandes plus spécifiques.

Par exemple, pour un système basé sur un modèle node/manager, j'aimerais pouvoir lui dire de changer de manager sans avoir à le relancer avec une nouvelle config:

monprogramme --changemanager NomDuNouveauManager

Je pense que ta solution est la meilleure, en tout cas la plus proche de ce que je recherche, car pure python et indépendante d'autre produit.

Pour la communication inter-process et l'envoi de commandes auxiliaires, l'excellent Crossbar, qui fait déjà partie de mes projets, fera l'affaire!

la réponse est quand même dependante ... de l'os ... du coup c'est plutot une question orientée OS et donc SysV ou SystemD ...

+8 votes

Essaye de regarder du côté de supervisor ou circus qui permettent facilement de daemoniser tout type de processus.

Pour ce qui est de la communication pour un processus qui tourne regarde du côté de os.mkfifo

répondu 21-Avr-2016 par joack (140 points)

Un truc par mal aussi est

websocketd.com

En gros ça map des websockets sur les entrées et sorties d'un programme...j'aime bien le concept. Ca ne répond pas à la question mais c'est intéressant quand même ;) pour intéragir avec des programmes.

+5 votes

Une autre solution: passer par la commande screen plutôt qu'un code python.

Elle permet de détacher ton programme d'un terminal.
L'interaction avec ce programme peut se faire en rappelant screen et avec un input() dans ton code python, ou en ouvrant un port sur le réseau local et en attendant des commandes via un protocole dédié.

Quelques liens:
- tuto ubuntu
- Archlinux [EN]
- In Unix, what is screen, and how do I use it? [EN]
- Screen Command Examples [EN]
- réponse SO qui traite de la discussion entre programme en passant par les sockets [EN]
- lien issu d'une autre réponse qui parle de sockets unix


Concernant les sockets unix : dans un système unix, tout est fichier. Les communications entre programmes sont possible via de multiple moyens, mais tous reviennent finalement à des écritures/lectures de fichiers partagé. Exemples: les IPC, les sockets, et les fichiers d'entrée/sortie standards.

Les solutions sont légions. En géréral, les étudiants en licence d'informatique en mangent une ou deux minimum pendant le cours de programmation système.

répondu 21-Avr-2016 par lucas (2,204 points)
edité 21-Avr-2016 par lucas
+2 votes

Bonjour,

Il y a une lib sympa pleine d'outil de ce type PythonSol: https://pypi.python.org/pypi/pythonsol/0.0.25

tres simple a utiliser:
tu definie une class qui herite de Daemon:
et un methode onstart qui ne sort jamais

class Server(Daemon):
    def _on_start(self):
        gevent.spawn(monbordel)
        # blabla
        while self.is_running
            SolBase.sleep(100)

ps: je ne trouve pas la doc pour formater mon post ici

répondu 7-Aou-2016 par anonyme
edité 7-Aou-2016 par max
...