Bonjour,
Après plusieurs essais infructueux :aie: je viens vers vous pour trouver un moyen d'exécuter un script python en mono-instance.
Merci de votre aide.
Version imprimable
Bonjour,
Après plusieurs essais infructueux :aie: je viens vers vous pour trouver un moyen d'exécuter un script python en mono-instance.
Merci de votre aide.
Qu'est que tu appel un script mono instance....
regarde par ici => les mutex sous windows
Sinon, un peu moins pro, ton script verifie une valeur dans un fichier au lancement qui indique si ton script tourne, si il tourne tu arrêtes ton script, sinon tu modifies cette valeur, sans oublier de la reinitialiser à la fin de ton script.
A toi de voir selon ton besoin.
Par mono-instance je veux dire que mon script ne puisse être exécuté qu'une seule fois à la fois. Donc si le script est déjà lancé ne pas pouvoir le relancer.
J'ai essayé sous linux en exécutant un test sur les processus lancés. Cela fonctionne bien quand je lance le script depuis l'invité de ligne de commande, mais pas s'il est lancé automatiquement au démarrage de linux. De plus cela ne fonctionne pas sous Windows vu que j'utilise une commande linux.
Voici le boût de code :
J'avais pensé à l'idée d'un fichier flag créé au lancement du script, mais si mon script s'arrète de façon inopinée, le fichier n'est pas supprimé et impossible de relancer le script.Code:
1
2
3
4
5
6 import commands process = commands.getoutput("ps x -o \"%a\" |grep 'mom_script.py'") result = re.findall("mon_script.py",process) if len(result) >1 : # le script est déjà lancé !
a toi de gérer l'imprevisible....Citation:
mais si mon script s'arrète de façon inopinée
Un peu plus tordu: ton script inscrit son heure de lancement dans un fichier, le remet a l'heure regulierement et un autre script lancé toutes les 5 mins verifie ce fichier et relance le script le cas echeant.
Oui j'essai bien de gérer les erreurs inopinées mais le script que j'ai trouvé ne fonctionne pas non plus :p Ce script devrait intercepter toutes les erreurs et les inscrire dans le fichier de log. Mais non il ne veut pas ! 8O
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import traceback def MyExceptHook(type, value, tb): dateHeureLog = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S') # date et heure du log dateFichierLog = datetime.datetime.now().strftime('%Y%m%d') # date nom fichier log nomFichierLog = dateFichierLog + "_TraceAllMode.log" # nom du fichier log du jour txtLog = traceback.format_exception(type, value, tb) of = open(_gsLogPath + nomFichierLog,'a') # ouverture du fichier de log of.write(txtLog + '---------------------------------------------------------\n') # ajout de la ligne en fin de fichier of.close() # fermeture du fichier de log sys.exit(2) sys.excepthook=MyExceptHook
Dans le même ordre d'idée, c'est un tantinet mieux d'utiliser un tube (pipe) qu'une chaussette (socket).
En effet, les tubes (nommés) sont plus "léger" car ne mettent pas oeuvre la couche réseau.