web-dev-qa-db-fra.com

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

J'ai un très simple script Python que je souhaiterais pouvoir 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 que upstart + monit overkill? Est-ce que quelqu'un connaît une alternative plus simple, ou un bon tutoriel pour upstart + monit? Si je veux juste être sûr que le script est toujours en cours d'exécution, monit est-il requis?

10
sebpiq

Le moyen le plus simple de le faire est de placer ceci dans /etc/init/something.conf:

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

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

Respawn le relancera s'il est tué ou s'il quitte non nul (comme une exception non capturée). Cela fonctionnera depuis Ubuntu 10.04.

Si vous avez 12.04, vous pouvez obtenir plus de fantaisie. Ce qui précède lancera votre script en tant que root. Dans 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 ferme alors qu'il n'y a pas de réseau disponible et que vous prévoyez de l'exécuter sur une connexion réseau instable, vous devriez résoudre ce problème et le laisser rester en vie/réessayer. Mais si vous ne le pouvez pas, vous devrez peut-être également le démarrer manuellement chaque fois qu'un périphérique réseau apparaît. Vous pouvez donc placer ceci dans /etc/network/if-up.d/yourscript (le rendre exécutable avec chmod + x)

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

Où votre script est juste quelque chose d'arbitraire et unique à ce script particulier, et "quelque chose" est identique au nom du travail (tel que le /etc/init/something.conf suggéré précédemment).

16
SpamapS

Auparavant, l'approche habituelle était d'écrire un fichier contenant un horodatage ou l'ID de processus sur /tmp, puis de vérifier si cet identifiant de processus était toujours en cours d'exécution ou si l'horodatage était encore récent.

Vous pouvez aussi faire un simple while [ 1 ]; do phyton-script.ph; done qui relancerait le script au cas où il reviendrait.

Pour plus de possibilités, veuillez fournir plus d'informations sur votre script. Surtout pourquoi vous attendez-vous à ce qu'il se ferme ou se bloque de manière inattendue.

2
con-f-use