Arrêter un script python à partir d'une page web

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

Tobin
Messages : 26
Enregistré le : mer. 23 nov. 2016 09:11

Re: Arrêter un script python à partir d'une page web

Message par Tobin » jeu. 29 juin 2017 15:25

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 "?

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: Arrêter un script python à partir d'une page web

Message par Flachy Joe » jeu. 29 juin 2017 15:59

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é.

spourre
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

Message par spourre » jeu. 29 juin 2017 17:04

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

Avatar du membre
zeb
Raspinaute
Messages : 280
Enregistré le : ven. 19 sept. 2014 11:04

Re: Arrêter un script python à partir d'une page web

Message par zeb » ven. 30 juin 2017 10:10

@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 :mrgreen: il est bien foutu ce système Linux :mrgreen:
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::

spourre
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

Message par spourre » ven. 30 juin 2017 14:36

zeb a écrit :...
@spourre :mrgreen: il est bien foutu ce système Linux :mrgreen:
Normal, il est l'héritier direct d'un système bien conçu, largement précurseur et parfaitement cohérent: UNIX.
Rien à voir avec les bricolages infâmes de Billou :ugeek:

Sylvain

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: Arrêter un script python à partir d'une page web

Message par Flachy Joe » ven. 30 juin 2017 21:29

Toutafé Sylvain. :geek:

En fait on peut même utiliser la disparition du fichier lock comme condition d’arrêt et donc utiliser un seul fichier...

Avatar du membre
zeb
Raspinaute
Messages : 280
Enregistré le : ven. 19 sept. 2014 11:04

Re: Arrêter un script python à partir d'une page web

Message par zeb » lun. 3 juil. 2017 17:29

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...
Bof...

@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
Voilà, ça c'est POSIX !
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: Arrêter un script python à partir d'une page web

Message par Flachy Joe » lun. 3 juil. 2017 22:49

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.

Avatar du membre
zeb
Raspinaute
Messages : 280
Enregistré le : ven. 19 sept. 2014 11:04

Re: Arrêter un script python à partir d'une page web

Message par zeb » mar. 4 juil. 2017 10:41

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.
Dans mon panier : rpi1A+ : »:: »:: | rpi1B : »:: »:: | rpi1B+ : »:: »:: | rpi2B : »:: »:: | rpi3B : »:: »:: | rpi0 : »::

Avatar du membre
Flachy Joe
Messages : 88
Enregistré le : mar. 20 sept. 2016 22:30

Re: Arrêter un script python à partir d'une page web

Message par Flachy Joe » mar. 4 juil. 2017 12:48

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).

Répondre

Retourner vers « Utilisateurs avancés »