Arrêter un script python à partir d'une page web
Modérateur : Francois
Re: Arrêter un script python à partir d'une page web
Salut,
Zeb, merci j'ai bien compris. Je me permets tout de même de te poser une dernière petite question : ça marche pareil si j'envoie le code ASCII depuis mon code (\x03)?
Flachy, astucieux comme méthode. Mais une question aussi : comment je fais pour vérifier qu'un script est déjà en cours d'exécution ? Par exemple depuis ma page je clique une fois sur le bouton "lancer X script", qui se lance sans problème. Je clique une deuxième fois sur le même bouton, à ce moment comment vérifier que le script tourne déjà et éventuellement afficher un petit message : " le service est déjà en cours d'exécution "?
Zeb, merci j'ai bien compris. Je me permets tout de même de te poser une dernière petite question : ça marche pareil si j'envoie le code ASCII depuis mon code (\x03)?
Flachy, astucieux comme méthode. Mais une question aussi : comment je fais pour vérifier qu'un script est déjà en cours d'exécution ? Par exemple depuis ma page je clique une fois sur le bouton "lancer X script", qui se lance sans problème. Je clique une deuxième fois sur le même bouton, à ce moment comment vérifier que le script tourne déjà et éventuellement afficher un petit message : " le service est déjà en cours d'exécution "?
- Flachy Joe
- Messages : 88
- Enregistré le : mar. 20 sept. 2016 22:30
Re: Arrêter un script python à partir d'une page web
Salut,
dans le même genre je vérifierai l'existence d'un fichier ".lock" au début du script, quitterai s'il existe et le créerai sinon puis le détruirai une fois le travail effectué.
dans le même genre je vérifierai l'existence d'un fichier ".lock" au début du script, quitterai s'il existe et le créerai sinon puis le détruirai une fois le travail effectué.
-
- Raspinaute
- Messages : 735
- Enregistré le : lun. 22 déc. 2014 16:50
- Localisation : 67380 LINGOLSHEIM
Re: Arrêter un script python à partir d'une page web
Flachy Joe a écrit :Salut,
dans le même genre je vérifierai l'existence d'un fichier ".lock" au début du script, quitterai s'il existe et le créerai sinon puis le détruirai une fois le travail effectué.
Bonjour,
C’est une approche tellement classique qu'il y a même un répertoire destiné à accueillir ces fichiers: /var/lock (lien vers /run/lock)..
On peut même pousser le vice jusqu'à écrire le PID du programme dans ce fichier, ce qui permet de lui envoyer un signal.
Sylvain
Re: Arrêter un script python à partir d'une page web
@Tobin : Ce n'est pas le caractère \x3 qui envoie le signal, c'est le shell qui interprète le Ctrl+C. Donc non.
@spourre il est bien foutu ce système Linux
@spourre il est bien foutu ce système Linux
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::
-
- Raspinaute
- Messages : 735
- Enregistré le : lun. 22 déc. 2014 16:50
- Localisation : 67380 LINGOLSHEIM
Re: Arrêter un script python à partir d'une page web
Normal, il est l'héritier direct d'un système bien conçu, largement précurseur et parfaitement cohérent: UNIX.zeb a écrit :...
@spourre il est bien foutu ce système Linux
Rien à voir avec les bricolages infâmes de Billou
Sylvain
- Flachy Joe
- Messages : 88
- Enregistré le : mar. 20 sept. 2016 22:30
Re: Arrêter un script python à partir d'une page web
Toutafé Sylvain.
En fait on peut même utiliser la disparition du fichier lock comme condition d’arrêt et donc utiliser un seul fichier...
En fait on peut même utiliser la disparition du fichier lock comme condition d’arrêt et donc utiliser un seul fichier...
Re: Arrêter un script python à partir d'une page web
Bof...Flachy Joe a écrit :En fait on peut même utiliser la disparition du fichier lock comme condition d’arrêt et donc utiliser un seul fichier...
@Flachy Joe
Tu proposes de supprimer le fichier /var/lock/mon_script.py pour signaler au script de quitter ?????
Ben, ce n'est pas très POSIX, ça !
Indépendamment de savoir si l'on est en python ou pas, sur Framboise ou pas, la manière UNIX de traiter le problème est la suivante :
1°) A la création du processus, vérifier si le fichier mon_script.(lock|run|pid) (au goût du programmeur) existe dans (/var)?/(run|lock) (en fonction de l'environnement).
Si le fichier existe,
>>> lire son contenu qui doit être un identifiant de processus (PID).
>>> si le process existe,
>>> >>> quitter en erreur (exit >1) avec un message sur STDERR.
>>> sinon
>>> >>> supprimer le fichier dans /run (ou autre)
2°) Créer le fichier de lock/run/pid avec le PID du processus courant dedans.
3°) Préparer la capture du signal SIGINT et y associer une fonction (gestionnaire) qui supprime le fichier.
C'est trap en shell, sigaction en C, signal.signal en Python
4°) Prévoir de supprimer le fichier de lock/run/pid en cas de fin de processus.
Pour tuer le processus de "l'extérieur", envoyer le signal SIGINT au processus dont le PID est dans le fichier de lock/run/pid qui sortira proprement.
En shell :
Code : Tout sélectionner
#!/bin/sh
# commande arrete_moi_mon_script
if [ -r /run/mon_script.pid ]; then
kill -2 `/run/mon_script.pid`
else
echo 'Impossible de trouver le PID de mon_script.' >&2
exit 1
fi
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::
- Flachy Joe
- Messages : 88
- Enregistré le : mar. 20 sept. 2016 22:30
Re: Arrêter un script python à partir d'une page web
Effectivement zeb, c'est beaucoup plus propre comme ça mais l'utilisation de la disparition du fichier permet de donner l'autorisation d’arrêter le script à un autre utilisateur, il suffit qu'il ait les droits sur le fichier. Alors que donner les droits de signal sur le processus c'est plutôt galère...
Je pense à un combo cron/php par exemple.
Je pense à un combo cron/php par exemple.
Re: Arrêter un script python à partir d'une page web
L'un n'empêche pas l'autre.
J'ai proposé un fonctionnement classique, standard et normé (POSIX).
Avec tes fichiers présents ou pas, tu en proposes un autre tout aussi classique, quoique moins standard.
Et pourtant, le démarrage SysV en fait bon usage. Je pense aux fichiers /fastboot ou /etc/utc qui, s'ils existent et quelque soit leur contenu, vont influencer le boot.
Alors je ne vois pas pourquoi ce qui est bon pour System V sera mauvais pour Tobin
Dans mes exemples, à la suite de spourre, je cite les dossiers /run, /var/run et /var/lock.
Le fichier de lock qu'on voudrait y gérer peut s'appeler mon_script.lock, mon_script.pid , mon_script.run ou mon_script tout court.
J'aime l'idée de créer le fichier /var/run/mon_script avec le PID dedans, sans présumer par son nom de son usage.
Un processus existe, de tel PID, et tant qu'il tourne (run), le fichier existe.
La simplicité des signaux rend cette solution particulièrement élégante.
--------------
Là où je suis moins d'accord avec toi FJ, c'est quand tu opposes à cette solution des problèmes de droits.
La gestion de ces processus doit être effectuée par un seul et même utilisateur. Ça aussi c'est POSIX.
sudo n'est pas que pour prendre les droits de root.
J'ai proposé un fonctionnement classique, standard et normé (POSIX).
Avec tes fichiers présents ou pas, tu en proposes un autre tout aussi classique, quoique moins standard.
Et pourtant, le démarrage SysV en fait bon usage. Je pense aux fichiers /fastboot ou /etc/utc qui, s'ils existent et quelque soit leur contenu, vont influencer le boot.
Alors je ne vois pas pourquoi ce qui est bon pour System V sera mauvais pour Tobin
Dans mes exemples, à la suite de spourre, je cite les dossiers /run, /var/run et /var/lock.
Le fichier de lock qu'on voudrait y gérer peut s'appeler mon_script.lock, mon_script.pid , mon_script.run ou mon_script tout court.
J'aime l'idée de créer le fichier /var/run/mon_script avec le PID dedans, sans présumer par son nom de son usage.
Un processus existe, de tel PID, et tant qu'il tourne (run), le fichier existe.
La simplicité des signaux rend cette solution particulièrement élégante.
--------------
Là où je suis moins d'accord avec toi FJ, c'est quand tu opposes à cette solution des problèmes de droits.
La gestion de ces processus doit être effectuée par un seul et même utilisateur. Ça aussi c'est POSIX.
sudo n'est pas que pour prendre les droits de root.
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::
- Flachy Joe
- Messages : 88
- Enregistré le : mar. 20 sept. 2016 22:30
Re: Arrêter un script python à partir d'une page web
Je suis complètement d'accord avec toi sur l'élégance de ta solution et de sa correspondance avec POSIX ainsi que sur le bien-fondé de la mettre en place.
Mais je maintiens que ma solution, qui est plutôt une bidouille, est plus souple et peut être mise en œuvre plus facilement à travers des protocoles variés (en fait tous les protocoles qui gères les fichiers et même sur des systèmes de fichiers qui ne gèrent pas les droits).
Mais je maintiens que ma solution, qui est plutôt une bidouille, est plus souple et peut être mise en œuvre plus facilement à travers des protocoles variés (en fait tous les protocoles qui gères les fichiers et même sur des systèmes de fichiers qui ne gèrent pas les droits).