10 votes

Comment exécuter un script Python en arrière-plan et le redémarrer après un crash?

J'ai un script Python très simple que j'aimerais toujours exécuter sur mon serveur Ubuntu 12.04. J'ai pensé utiliser upstart + monit. Le problème est que ces outils semblent plutôt compliqués pour un simple mortel comme moi, et je ne trouve pas un exemple simple sur le web.

Est-ce qu'upstart + monit est trop lourd ? Est-ce que quelqu'un connaît une alternative plus simple, ou un bon tutoriel pour upstart + monit ? Si je veux juste m'assurer que le script est toujours en cours d'exécution, monit est-il nécessaire ?

16voto

Jeremy Ruten Points 59989

La manière la plus simple de faire cela est de le placer dans /etc/init/something.conf :

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Respawn le redémarrera s'il est tué ou s'arrête avec un code de sortie non nul (comme une exception non capturée). Cela fonctionnera même sur Ubuntu 10.04.

Si vous avez la version 12.04 vous pouvez avoir quelque chose de plus sophistiqué. Ce qui précède exécutera votre script en tant que root. Dans la version 12.04 vous pouvez ajouter setuid/setgid :

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Si votre script se termine quand il n'y a pas de réseau disponible et que vous prévoyez de l'exécuter sur une connexion réseau instable, eh bien, vous devriez corriger cela et le maintenir en vie/relancer. Mais si ce n'est pas possible, vous devrez peut-être aussi le démarrer manuellement chaque fois qu'un périphérique réseau se connecte. Vous pouvez donc le placer dans /etc/network/if-up.d/yourscript (rendez-le exécutable avec chmod +x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Où yourscript est juste quelque chose d'arbitraire et unique pour ce script particulier, et "something" est identique au nom de job (comme suggéré précédemment dans /etc/init/something.conf).

2voto

con-f-use Points 17925

L'approche habituelle depuis les anciens jours était d'écrire un fichier contenant un horodatage ou l'identifiant de processus à /tmp et ensuite vérifier si cet identifiant de processus était toujours en cours d'exécution ou respectivement si l'horodatage était toujours récent.

Vous pouvez également faire un simple while [ 1 ]; do phyton-script.ph; done qui redémarrerait le script en cas de retour.

Pour plus de possibilités, veuillez fournir plus d'informations sur votre script. Surtout sur la raison pour laquelle vous vous attendez à ce qu'il se termine ou plante de manière inattendue.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X