web-dev-qa-db-fra.com

Daemon vs Upstart pour python

J'ai écrit un module en Python et je veux qu'il fonctionne en continu une fois démarré et je dois l'arrêter quand j'ai besoin de mettre à jour d'autres modules. J'utiliserai probablement monit pour le redémarrer, si le module a s'est écrasé ou ne fonctionne pas autrement.

Je passais par différentes techniques comme Daemon , pstart et bien d'autres.

Quelle est la meilleure façon de procéder pour que j'utilise cette approche dans tous mes nouveaux modules pour continuer à les exécuter pour toujours?

40
mtariq

D'après votre mention d'Upstart, je suppose que cette question concerne un service exécuté sur un serveur Ubuntu.

Sur un serveur Ubuntu, un travail parvenu est vraiment l'option la plus simple et la plus pratique pour créer un service toujours actif qui démarre au bon moment et peut être arrêté ou rechargé avec des commandes familières.

Pour créer un service parvenu, vous devez ajouter un seul fichier à /etc/init. Appelé <service-name>.conf. Un exemple de script ressemble à ceci:

description "My chat server"
author "[email protected]"

start on runlevel [2345]
stop on runlevel [!2345]

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set

respawn

exec /srv/applications/chat.py

Cela signifie qu'à chaque démarrage de la machine, il démarrera chat.py programme. S'il meurt pour une raison quelconque, il le redémarrera. Vous n'avez pas à vous soucier du double forking ou de la démonétisation de votre code. C'est géré pour vous par upstart.

Si vous souhaitez arrêter ou démarrer votre processus, vous pouvez le faire avec

service chat start 
service chat stop

Le nom chat est automatiquement trouvé à partir du nom du .conf fichier à l'intérieur /etc/init

Je ne couvre ici que les bases de l'arrivée. Il existe de nombreuses autres fonctionnalités pour le rendre encore plus utile. Tous disponibles en exécutant man upstart.

Cette méthode est beaucoup plus pratique que d'écrire votre propre code de démonisation. Un fichier de configuration de 4 à 8 lignes pour un composant Ubuntu intégré est beaucoup moins sujet aux erreurs que de faire en sorte que votre code double en toute sécurité, puis de le surveiller par un autre processus pour vous assurer qu'il ne disparaît pas.

Monit est un peu un hareng rouge. Si vous voulez des alertes d'indisponibilité, vous devrez quand même exécuter un programme de surveillance sur un serveur séparé. Comptez sur le démarrage pour que le processus s'exécute toujours sur un serveur. Ensuite, ayez un service différent qui s'assure que le serveur fonctionne réellement. Les temps d'arrêt se produisent pour de nombreuses raisons différentes. Un processus exécuté sur le même serveur ne vous dira rien de précis si le serveur lui-même tombe en panne. Vous avez besoin d'une machine distincte (ou d'un fournisseur tiers comme pingdom) pour vous alerter sur cette condition.

81
aychedee

Vous pouvez vérifier superviseur . Il est capable de démarrer un processus au démarrage du système, puis de le maintenir en vie jusqu'à l'arrêt.

Le fichier de configuration le plus simple serait:

[program:my_script]
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR
autostart = True
autorestart = True

Ensuite, vous pouvez le lier à /etc/supervisord/conf.d, courir Sudo supervisorctl pour entrer dans la console de gestion du superviseur, saisissez reread pour que le superviseur remarque une nouvelle entrée de configuration et update pour afficher les nouveaux programmes dans la liste status.

Pour démarrer/redémarrer/arrêter un programme, vous pouvez exécuter Sudo supervisorctl start/restart/stop my_script.

8
Maciej Gol

J'ai utilisé l'initscript à l'ancienne avec l'utilitaire start-stop-daemon. Regardez skel dans /etc/init.d

3
eri