[PHP][Resolu] Envoyer un signal à un processus depuis une page PHP ?

Envoyer un signal à un processus depuis une page PHP ? [PHP][Resolu] - PHP - Programmation

Marsh Posté le 11-05-2009 à 19:45:36    

Bonsoir à tous  :hello:  
 
Je travaille sur une petite carte linux embarqué (coeur ARM9) dont le système de fichier est sur nand flash, en jffs2.
 
Mon application utilise des paramètres qui sont stockés dans une base de données sqlite. A côté de ça j'ai crée une interface web en php qui permet de modifier les paramètres de l'application.
 
J'ai besoin d'être assez réactif entre la modification des parametres par l'interface web et la prise en compte de ces nouveaux parametres par l'application.
Du coup actuellement dans mon application je viens raffraichir ma table de parametres depuis la base de donnée toutes les 5 secondes.
 
Ca fonctionne très bien, mais ce principe me gene, car bien que je fasse uniquement des lecture, sqlite fait des accès disque en ecriture (pour ses fichiers temporaires). Et des accès disque toutes les 5 secondes je voudrais eviter pour pas bousiller prématurement la mémoire flash.
 
Mon idée serait de ne recharger les parametres depuis la base de données uniquement quand ils ont changé. Pour faire ça, dans mon interface PHP, après avoir fait une ecriture dans la base de données, je voudrais que le script PHP envoie un signal à mon application, pour lui dire de recharger les parametres.
 
Du côté de mon application, tout est prêt ! j'ai capturé le signal SIGUSR1, et quand j'envoie ce signal au processus, il fait bien son raffraichissement des parametres.
 
Maintenant là où je coince, c'est du côté du php. Comment envoyer le signal à mon processus, et avant de faire ça, comment récupérer le n° de processus de mon application ?
 
Une idée ?
Bonne soirée  :)


Message édité par nlc le 11-05-2009 à 21:43:55

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 11-05-2009 à 19:45:36   

Reply

Marsh Posté le 11-05-2009 à 21:43:31    

Bon je me réponds à moi même j'ai fini par trouver la solution tout seul.
 
C'est tout con en fait il suffit de faire ça dans le script php :
 

Code :
  1. system( "pkill -SIGUSR1 nomDuProgramme" );


 
Du coup c'est top je ne vient recharger mes paramètres depuis la base de données uniquement si au moins l'un d'en eux a été changé par l'interface web 8)
 
La flash nand peut me dire merci :D


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 12-05-2009 à 15:10:29    

tu as posix_kill pour ça plus proprement, a priori ;)
 
http://fr.php.net/manual/en/function.posix-kill.php


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 12-05-2009 à 15:15:45    

(...bon après faut voir si tu peux récupérer facilement le pid de ton process...[:joce])


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 12-05-2009 à 16:45:06    

skeye a écrit :

(...bon après faut voir si tu peux récupérer facilement le pid de ton process...[:joce])


Effectivement, ta fonction serait mieux, mais comment récupérer le n° de processus directement depuis php ?  :??:


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 12-05-2009 à 17:18:08    

nlc a écrit :


Effectivement, ta fonction serait mieux, mais comment récupérer le n° de processus directement depuis php ?  :??:


ça n'a pas l'air faisable, après avoir jeté un oeil rapidement aux fonctions posix_*...donc ta solution est probablement le plus simple...;)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 12-05-2009 à 17:51:11    

J'avais jeté un oeil aussi sur la liste des fonctions posix du coup, mais y a rien pour trouver le pid d'un processus par son nom.
 
En tout cas ça tourne depuis tout à l'heure sans problème !  
 
Je suis même allé plus loin que ça. Dans mon application j'ai des variables de fonctionnement que je dois afficher à l'utilisateur sur l'interface web.
 
J'utilisais le même système qu'au départ, l'application venait mettre à jour régulièrement une table dans la bdd, et l'interface venait taper dedans pour afficher les valeurs à l'utilisateur.
 
Maintenant dans le script PHP qui m'affiche les valeurs, juste avant de faire la lecture des valeurs dans la bdd j'envoie le signal SIGUSR1 à l'application et je fais un sleep de 0.5 seconde.
 
Du coup l'appli recoit le signal et a le temps de mettre à jour la bdd avec les dernières valeurs en cours avant que le script php n'y accède pour les récupérer et les afficher !
 
Et le temps de latence de 0.5 seconde n'est pas génant du tout.
 
L'appli est donc capable de recevoir 2 signaux, un pour raffraichir la table des valeurs à afficher à l'utilisateur sur la page web, et l'autre pour venir recharger la table des paramètres quand au moins un parametre a été modifié par l'utilisateur.


Message édité par nlc le 12-05-2009 à 17:52:24

---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 07-12-2011 à 16:37:24    

Bonjour,
 
J'essaie de faire la meme manipulation que vous en essayant de tuer un processus avec la commande system dans php. Cependant, ca ne fonctionne pas le processus reste actif. J'ai vérifié que je ne suis pas en Safe_mode. Je pense que cela vient des droits attribués par apache2. Le problème est que mon système est démarré en mode root et que je n'arrive quand meme pas à utiliser la fonction system("kill -SIGUSR1 NomProg" );   . Alors que quand j'utilise la meme commande "kill -SIGUSR1 NomProg" dans un terminal, ca fonctionne...
 
Merci d'avance de votre aide
 
Bien cordialement

Reply

Marsh Posté le 07-12-2011 à 17:14:12    

Je pense en effet que le souci c'est que le script php tourne avec les droits apache et donc la commande kill n'a pas les droits suffisants pour tuer le processus qui doit tourner en mode root.
 
Je pense que la solution c'est que le processus à tuer soit lancé avec les droits apache par exemple. C'est quoi ce processus et il est lancé comment ?


Message édité par nlc le 07-12-2011 à 17:14:23
Reply

Marsh Posté le 07-12-2011 à 17:23:17    

Tout d'abord merci pour votre réponse!!
 
mon processus est un programme que j'ai écrit qui, pour le moment, est une boucle infini qui capte avec la fonction sigaction le signal SIGUSR1, et lorsque c'est le cas, il affiche un message sur le terminal. ce programme fonctionne bien vu que lorsque j'utilise la commande pkill sur le terminal directement, il m'affiche le bon message.  
 
En revanche savez vous comment changer les droits en droits apache justement??? (PS: j'utilise le paquage XAMPP qui regroupe les différents modules apache2, php5, mysql...)
 

Reply

Marsh Posté le 07-12-2011 à 17:23:17   

Reply

Marsh Posté le 07-12-2011 à 17:31:56    

Ouais donc c'est bizarre car si c'est pas pour tuer le processus mais envoyer un SIGUSR1, ça devrait pourtant fonctionner !?
 
Verifiez peut être si par hasard y a pas une config dans php qui empêche d'utiliser la commande system() ?


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 07-12-2011 à 17:56:18    

j'ai vérifié justement et je n'ai pas trouvé. j'essaie également avec la fonction exec() mais en vain...

Reply

Marsh Posté le 07-12-2011 à 18:09:14    

Essayez peut être l'exemple #1 ici : http://php.net/manual/fr/function.system.php
Ca permettrait de voir si la commande ls est bien executée grâce à la fonction system.
 


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 07-12-2011 à 18:18:36    

Oui la fonction tourne bien avec system() ca m'affiche les fichiers présent dans le répertoire courant. Lorsque je fais un "touch toto" ca fonctionne aussi. mais c lorsque je veu faire un kill, ou pkill ca ne fonctionne pas... peut etre il ne trouve pas mon programme (avec kill je rentre carement le PID du processus)

Reply

Marsh Posté le 07-12-2011 à 18:37:22    

moi j'utilise pkill car c'est plus pratique d'utiliser le nom, mais je suis sur un système embarqué j'ai pas les mêmes soucis pour les droits.
Essayez peut être dans une console de lancer votre processus en tant que apache pour voir si dans ce cas il reçoit bien le signal ?  
En étant root puis en faisant su apache (ou le nom correspondant au serveur web) ça devrait permettre de lancer le processus en tant qu'apache.


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 08-12-2011 à 09:21:21    

Sinon sans s'embêter à tourner en Apache, procédons plus simplement :
 

loicdouillet a écrit :

Oui la fonction tourne bien avec system() ca m'affiche les fichiers présent dans le répertoire courant. Lorsque je fais un "touch toto" ca fonctionne aussi. mais c lorsque je veu faire un kill, ou pkill ca ne fonctionne pas... peut etre il ne trouve pas mon programme (avec kill je rentre carement le PID du processus)


 
Que retourne exactement la fonction system sur kill et pkill ?
sa valeur de retour (sortie standard de la commande) et quelle est la valeur de l'entier de retour (valeur de retour de la commande) cf :

Citation :


string system ( string $command [, int &$return_var ] )


 
:??:


Message édité par FranceDenBas le 08-12-2011 à 09:26:59

---------------
"Il a inventé le bougisme : je bouge donc je suis" :sol: - Dupont-Aignan à propos de Son Altesse Sérénissime Sarkal 1er. Merci Handsome Devil et Meriadeck.
Reply

Marsh Posté le 08-12-2011 à 10:33:44    

oui je pense que c'est un bonne chose à tester !!


---------------
char table[] = {112,114,105,110,116,102,40,34,37,99,37,99,37,99,34,44,49,49,48,44,49,48,56,44,57,57,41,59,0}; char* tablePtr = table; while(*tablePtr) printf( "%c",*tablePtr++ );
Reply

Marsh Posté le 09-12-2011 à 10:01:15    

Bonjour, et merci encore pour vos réponses.
 
J'ai réussi à résoudre mon problème. c'était bien un problème de droit. En effet, apache sous Lampp (xampp) se lance sous l'utilisateur "nobody"  (utiliser la fonction php echo system('whoami'); pour connaitre le nom d'utilisateur. Je suis allé dans le fichier de configuration httpd.conf (envvars pour d'autre version de apache2). et j'ai changer la ligne correspondant à USER par mon nom d'utilisateur (mais pas en root car ca ne fonctionne pas => sécurité).  
J'ai fais un chown nomdutilisateur monprogramme  permettant de donner l'apartenance à nomdutilisateur du fichier. Et maintenant quand je lance le programme sous 'nomdutilisateur', le signal est bien intercepté par la commande php system(pkill -SIGUSR1 nomprogramme);
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed