IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Gestion de l'execution et l'arret d'un script Python.


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Gestion de l'execution et l'arret d'un script Python.
    Bijour,

    Je cherche le meilleur moyen de manager un script python qui tournerai en boucle en background sur une machine.

    Je verais bien un truc du genre python monProg.py start pour le demarrer et python monProg.py stop pour l'arreter.

    Tournant en boucle il faut qui s'arrete proprement à la fin de la boucle et pas en plein milieu. Je ne vois pas comment faire pour passer des "signaux" à mon script. Y'a t'il un moyen de faire cela?

    Sinon je pensais faire un script python qui s'occupe de lancer et d'arrêter le script python de mon application.

    -- start => ca créé un fichier temporaire et lance le script python en background
    A la fin de chaque boucle, le script python de l'appli teste si le fichier temporaire existe toujours. Si oui, il repart pour une boucle, sinon il s'arrête.

    -- stop => le script supprime le fichier temporaire. Le script python s'arretera donc tout seul à la fin de la boucle.

    Il y'a peut-être beaucoup plus simple? Merci de m'éclairer

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Je me suis documenté sur les modules subprocess et signal mais je ne vois pas trop comment faire ce que je veux.

    Quelqu'un pour m'aider?

  3. #3
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Si tu es sous Unix, il existe une solution assez simple.
    Tu peux créer un petit daemon, c'est à dire un serveur qui tourne en background, à l'aide du bien connu double fork.
    http://www.jejik.com/articles/2007/0...mon_in_python/

    Ca c'était pour faire tourner un truc en tâche de fond.
    Pour l'arrêt, tu vas devoir te servir des signaux.
    http://docs.python.org/library/signal.html

    Pour cela, il faut que la boucle de ton service ne soit pas un simple
    Mais qu'il y ait une condition qui repose sur quelque chose modifiable depuis l'extérieur. Typiquement, on se sert d'un threading.Event, sur lequel tu appelleras la méthode set() pour arrêter ta boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while not stopEvent.isSet():
    Ensuite, il te faut créer un gestionnaire de signal, mettons de sigkill, qui va faire un set() sur le stopEvent (pas en vrac comme ça évidemment... tu préféreras créer une méthode stopService sur ton service)

    Il ne manque plus que le fichier pour indiquer le pid du processus. Evidemment il doit être facilement retrouvable.
    Quand le programme ce lance, il crée le fichier, et pour le couper, tu récupères le pid dans ce fichier, et tu le kill.

    Mais je pense que ce dernier point est déjà implémenté dans le daemon dont je t'ai passé le lien.

    Bonne chance

    Ps: si tu es sous windows, l'idée est la même. La seule différence c'est que tu n'as pas droit au daemon unix :p

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    Salut

    Si tu es sous Unix, il existe une solution assez simple.
    Tu peux créer un petit daemon, c'est à dire un serveur qui tourne en background, à l'aide du bien connu double fork.
    http://www.jejik.com/articles/2007/0...mon_in_python/

    Ca c'était pour faire tourner un truc en tâche de fond.
    Pour l'arrêt, tu vas devoir te servir des signaux.
    http://docs.python.org/library/signal.html

    Pour cela, il faut que la boucle de ton service ne soit pas un simple
    Mais qu'il y ait une condition qui repose sur quelque chose modifiable depuis l'extérieur. Typiquement, on se sert d'un threading.Event, sur lequel tu appelleras la méthode set() pour arrêter ta boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while not stopEvent.isSet():
    Ensuite, il te faut créer un gestionnaire de signal, mettons de sigkill, qui va faire un set() sur le stopEvent (pas en vrac comme ça évidemment... tu préféreras créer une méthode stopService sur ton service)

    Il ne manque plus que le fichier pour indiquer le pid du processus. Evidemment il doit être facilement retrouvable.
    Quand le programme ce lance, il crée le fichier, et pour le couper, tu récupères le pid dans ce fichier, et tu le kill.

    Mais je pense que ce dernier point est déjà implémenté dans le daemon dont je t'ai passé le lien.

    Bonne chance

    Ps: si tu es sous windows, l'idée est la même. La seule différence c'est que tu n'as pas droit au daemon unix :p
    Il te suffirait de créer un handler pour, mettons, le sigkill
    Super merci bien, effectivement l'idée du daemon est pas mal, je vais noter ce liens dans un coin. Par contre ca me semble un peut plus compliqué qu'un simple fichier qui est checker à chaque boucle.

    Je vais voir comment je vais faire!

  5. #5
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par Bonsuere Voir le message
    Par contre ca me semble un peut plus compliqué qu'un simple fichier qui est checker à chaque boucle.
    Ca me parait pas très propre comme solution, mais pq pas après tout
    Juste... si la boucle est critique niveau performance, tu vas perdre un max de temps à vérifier l'existence du fichier.

Discussions similaires

  1. Executer un formulaire HTML depuis un script python
    Par toptopython dans le forum Général Python
    Réponses: 4
    Dernier message: 12/10/2013, 08h28
  2. programme d'execution impossible a arreté et introuvable
    Par sniperrr dans le forum Windows XP
    Réponses: 2
    Dernier message: 19/02/2010, 10h55
  3. [Sécurité] Arret d'un script au bout d'une heure
    Par NhyMbuS dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 15/11/2006, 18h11
  4. [Système] Executer un programme externe depuis un scripte php
    Par Scorpion Rouge dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2006, 11h59
  5. Executer en tant que en shell script ?
    Par fabszn dans le forum Linux
    Réponses: 3
    Dernier message: 13/01/2006, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo