J'ai un démon python en cours d'exécution dans le cadre de mon application Web / Comment puis-je vérifier rapidement (en utilisant python) si mon démon est en cours d'exécution et, sinon, le lancer?
Je veux le faire de cette façon pour corriger les plantages du démon, et donc le script n'a pas besoin d'être exécuté manuellement, il s'exécutera automatiquement dès qu'il sera appelé et continuera à fonctionner.
Comment puis-je vérifier (à l'aide de python) si mon script est en cours d'exécution?
Réponses:
Déposez un fichier pid quelque part (par exemple / tmp). Ensuite, vous pouvez vérifier si le processus est en cours d'exécution en vérifiant si le PID dans le fichier existe. N'oubliez pas de supprimer le fichier lorsque vous vous arrêtez proprement et de le vérifier au démarrage.
Ensuite, vous pouvez vérifier si le processus est en cours d'exécution en vérifiant si le contenu de /tmp/mydaemon.pid est un processus existant. Monit (mentionné ci-dessus) peut le faire pour vous, ou vous pouvez écrire un simple script shell pour le vérifier pour vous en utilisant le code de retour de ps.
Pour un crédit supplémentaire, vous pouvez utiliser le module atexit pour vous assurer que votre programme nettoie son pidfile en toutes circonstances (une fois tué, des exceptions levées, etc.).
la source
if os.path.isfile(pidfile)
évaluation soit false pour les deux, les obligeant à écrire le fichier de verrouillage et à continuer à s'exécuter.file()
été supprimé et que vous devriez utiliser à laopen()
place. De plus, même si vous êtes sur 2.7, vous devriez utiliseropen()
overfile()
comme expliqué ici: docs.python.org/2/library/functions.html#file (Et oui, si vous avez utilisé python vers 2.2, le conseil officiel était le contraire. Apparemment, ils ont changé d'avis.)Une technique pratique sur un système Linux utilise des sockets de domaine:
C'est atomique et évite le problème d'avoir des fichiers de verrouillage qui traînent si votre processus reçoit un SIGKILL
Vous pouvez lire dans la documentation
socket.close
que les sockets sont automatiquement fermés lors du nettoyage de la mémoire.la source
\0
) signifie que le socket est créé dans l'espace de noms abstrait au lieu d'être créé sur le système de fichiers lui-même.La bibliothèque pid peut faire exactement cela.
Il traitera également automatiquement le cas où le pidfile existe mais que le processus ne s'exécute pas.
la source
with PidFile(piddir='/home/user/run/')
pour utiliser un répertoire différent pour placer le fichier pid dans lequel vous avez des permissions. Ensuite, vous n'avez pas besoin de l'exécuter en tant que rootBien sûr, l'exemple de Dan ne fonctionnera pas comme il se doit.
En effet, si le script plante, déclenche une exception ou ne nettoie pas le fichier pid, le script sera exécuté plusieurs fois.
Je suggère ce qui suit basé sur un autre site Web:
Ceci permet de vérifier s'il existe déjà un fichier de verrouillage
Cela fait partie du code où nous mettons un fichier PID dans le fichier de verrouillage
Ce code vérifiera la valeur de pid par rapport au processus en cours d'exécution existant, évitant ainsi la double exécution.
J'espère que cela aidera.
la source
os.kill(old_pid, 0)
, qui devrait être plus portable sous UNIX. Il augmenteraOSError
s'il n'y a pas de tel PID ou s'il appartient à un utilisateur différent.Il existe de très bons packages pour redémarrer les processus sous UNIX. Celui qui a un excellent tutoriel sur la construction et la configuration est monit . Avec quelques ajustements, vous pouvez avoir une technologie éprouvée solide comme le roc pour maintenir votre démon.
la source
Ma solution est de vérifier le processus et les arguments de la ligne de commande Testé sur Windows et Ubuntu Linux
la source
Il existe une myriade d'options. Une méthode consiste à utiliser des appels système ou des bibliothèques python qui effectuent de tels appels pour vous. L'autre consiste simplement à engendrer un processus comme:
et analysez la sortie. Beaucoup de gens choisissent cette approche, ce n'est pas nécessairement une mauvaise approche à mon avis.
la source
Je suis tombé sur cette vieille question à la recherche d'une solution moi-même.
Utilisez psutil :
la source
Je suis un grand fan de Supervisor pour la gestion des démons. Il est écrit en Python, il existe donc de nombreux exemples sur la façon d'interagir avec ou de l'étendre à partir de Python. Pour vos besoins, l' API de contrôle de processus XML-RPC devrait fonctionner correctement.
la source
Essayez cette autre version
la source
Plutôt que de développer votre propre solution de fichier PID (qui a plus de subtilités et de cas de coin que vous ne le pensez), jetez un œil à supervisord - il s'agit d'un système de contrôle de processus qui facilite le contrôle des tâches et les comportements de démon autour d'un Python existant scénario.
la source
Les autres réponses sont excellentes pour des choses comme les tâches cron, mais si vous exécutez un démon, vous devriez le surveiller avec quelque chose comme daemontools .
la source
si votre script de débogage dans pycharm quitte toujours
la source
essaye ça:
la source
Voici un code plus utile (avec vérification si exactement python exécute le script):
Voici la chaîne:
renvoie 0 si "grep" réussit et que le processus "python" est en cours d'exécution avec le nom de votre script comme paramètre.
la source
Un exemple simple si vous recherchez uniquement un nom de processus existe ou non:
la source
Considérez l'exemple suivant pour résoudre votre problème:
Je suggère ce script car il ne peut être exécuté qu'une seule fois.
la source
Utilisation de bash pour rechercher un processus avec le nom du script actuel. Aucun fichier supplémentaire.
Pour tester, ajoutez
la source
ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'
j'exécutais cette chose? ;)ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'
fait. Si vous avez besoin de rechercher un processus par son nom, pourquoi ne pas l'utiliserpgrep
? Quel est le but deawk '{print $2}'| awk '{print $2}'
? En général, vous ne pouvez pas exécuter awk deux fois de suite comme ça à moins de changer le délimiteur. Le premier awk entraîne la colonne PID ... Le second awk ne donnera rien.C'est ce que j'utilise sous Linux pour éviter de démarrer un script s'il est déjà en cours d'exécution:
Cette approche fonctionne bien sans aucune dépendance à un module externe.
la source