J'exécute mon script Python en arrière-plan sur ma machine Ubuntu (12.04) comme ceci -
nohup python testing.py > test.out &
Maintenant, il pourrait être possible qu'à un certain stade, mon dessus Python script
puisse mourir pour une raison quelconque.
Je pense donc avoir une sorte de cron agent
script shell bash qui peut redémarrer mon script Python ci-dessus automatiquement s'il est tué pour une raison quelconque.
Est-ce possible? Si oui, quelle est la meilleure façon de résoudre ce genre de problème?
MISE À JOUR:
Après avoir créé le testing.conf
fichier comme ceci -
chdir /tekooz
exec python testing.py
respawn
J'ai couru sous la commande sudo pour le démarrer, mais je ne vois pas ce processus s'exécuter derrière en utilisant ps ax?
root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3 S+ 0:00 grep --color=auto testing.py
Une idée pourquoi px ax ne me montre rien? Et comment vérifier si mon programme fonctionne ou non?
Ceci est mon script python -
#!/usr/bin/python
while True:
print "Hello World"
time.sleep(5)
/etc/init
fichier? Si vous pouvez me fournir un guide étape par étape, alors je serai en mesure d'apprendre quelque chose et de faire la bonne chose ..sys.stdout = open(file_name, 'w')
au début.px ax | grep testing.py
.. Ça ne me rend rien? Une idée pourquoi?Vous pouvez également adopter une approche plus orientée shell. Cherchez votre
cron
script et relancez-le s'il meurt.Créez un nouveau crontab en exécutant
crontab -e
. Cela fera apparaître une fenêtre de votre éditeur de texte préféré.Ajoutez cette ligne au fichier qui vient de s'ouvrir
Enregistrez le fichier et quittez l'éditeur.
Vous venez d'en créer un nouveau
crontab
qui s'exécutera toutes les 5 minutes et lancera votre script à moins qu'il ne soit déjà en cours d'exécution. Voir ici pour un joli petit tutoriel surcron
. Les documents officiels d'Ubuntucron
sont ici .La commande en cours d'exécution est celle
pgrep
qui recherche dans les processus en cours d'exécution la chaîne donnée dans la ligne de commande.pgrep foo
recherchera un programme nomméfoo
et renverra son identifiant de processus .pgrep -f
le fait rechercher toute la ligne de commande utilisée pour lancer le programme et pas seulement le nom du programme (utile car il s'agit d'un script python).Le
||
symbole signifie "faites ceci si la commande précédente a échoué". Donc, si votre script n'est pas en cours d'exécution, lepgrep
échouera car il ne trouvera rien et votre script sera lancé.la source
crontab -e
depuis le répertoire où se trouve mon script python .. Correct?cron
est un démon de planification, c'est un service qui s'exécute en arrière-plan. Si votre script python n'est pas dans votre$PATH
(si vous ne pouvez pas le lancer de n'importe où mais devez être dans son répertoire) utilisez le chemin complet du script comme dans ma réponse mise à jour.Vous pouvez demander au programme de test de rediriger la sortie à l'aide d'une option de ligne de commande, puis d'utiliser un simple script python pour redémarrer le programme indéfiniment:
vous pouvez mettre ce programme en arrière-plan, et une fois que vous voulez arrêter, tirez-le simplement au premier plan et tuez-le.
la source
Vous ne devriez pas vraiment l'utiliser pour la production, mais vous pourriez:
Si, pour une raison quelconque, le processus python se termine, la boucle du shell continuera et redémarrera, en ajoutant le
.out
fichier comme vous le souhaitez. Presque pas de frais généraux et prend très peu de temps à installer.la source
Il existe plusieurs façons de surveiller et de réapparaître les processus sous UNIX / Linux. L'une des plus anciennes est une entrée "respawn" dans / etc / inittab ... si vous utilisez l'ancien système d'initialisation SysV. Une autre méthode consiste à utiliser le démon superviseur du package daemontools de DJ Bernstein . D'autres options consistent à utiliser les fonctionnalités d'Ubuntu upstart ... ou systemd ou autres.
Mais vous pouvez regarder les alternatives init et dans le code Python pour Pardus: démon mudur en particulier.
Si vous décidez d'aller avec un travail cron (et la gestion des fichiers PID), alors envisagez de lire ce PEP 3143 et peut-être d'utiliser son implémentation de référence.
Comme je l'ai mentionné dans mes autres commentaires, la gestion robuste des fichiers PID est délicate. Il est sujet aux courses et aux cas d'angle. Il devient plus difficile s'il y a une chance que votre fichier PID se retrouve sur un système de fichiers NFS ou un autre système de fichiers en réseau (une partie de l'atomicité garantit que vous obtenez avec la sémantique de gestion de fichiers sur les systèmes de fichiers UNIX / Linux locaux appropriés disparaissent sur certaines versions et implémentations de NFS, par exemple). La sémantique autour du verrouillage de fichiers sous UNIX peut également être délicate. (Un verrou
flock
oufcntl
est-il libéré rapidement, dans votre système d'exploitation cible, lorsque le processus le tenant est tué avec SIGKILL, par exemple?).la source
Vous pouvez également utiliser la surveillance Monit Or Process avec ps-watcher
Voici un exemple pour votre scénario:
Jetez un œil aux exemples de monit
la source
Vous avez besoin d'un superviseur, vous pouvez utiliser un superviseur . Il s'agit d'un superviseur basé sur python, donc facile à modifier si vous en avez besoin.
Le contrôle est avec des fichiers avec la syntaxe de fichier .ini.
la source
La réponse de Terdon n'a pas fonctionné pour moi, car elle
pgrep -f testing.py
n'a jamais «échoué». Il saisirait le pid pour le travail cron (en raison de l'option -f). Cependant, sans l'option -f, pgrep ne trouvera pas testing.py car il n'y a pas de processus appelé testing.py.Ma solution était de changer
à
cela signifie que le travail complet de crontab serait:
la source
Dans mon cas, en tant que solution rapide, je voulais garder mon programme en cours d'exécution lorsqu'il s'est terminé avec une erreur ou s'il a été tué. D'un autre côté, je voulais arrêter l'exécution lorsque le programme s'est terminé correctement (code retour = 0)
Je l'ai testé sur Bash. Il devrait fonctionner correctement dans tout autre shell
la source
Pour la réponse de terdon,
pgrep -f testing.py
ne retournera jamais faux selon les commentaires ici :Pour la réponse de Matt,
pgrep -f testing.py
est inutile carpgrep python
correspond à tout script Python en cours d'exécution. Donc, si deux cronjob de script Python, le second cronjob ne s'exécutera jamais.Et puis j'ai trouvé la solution à résoudre
pgrep -f testing.py
dans le commentaire ici: /ubuntu/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1Mon cron pour l'exécution de deux scripts Python:
la source