[Réglé] Un killall en PHP

WRInaute discret
Bonjour,

Pour un client avec son serveur dédié, nous avons besoin de relancer un service sur le serveur, manuellement, nous le faisons avec un killall (shell) et de cette manière, cela fonctionne bien.

Maintenant nous souhaitons ajouter un bouton dans l'admin du client pour faire le même travail. Nous ne parvenons pas à lancer cette commande depuis le PHP avec passthru, exec_shell .... aucune commande ne fait le travail ni ne donne un message d'erreur ...

Identique avec la méthode sudo qui permet de lancer la commande en mode 'root', cela ne marche pas non plus

Il doit y avoir une protection quelque part, bien logique d'ailleurs, mais quelqu'un a une idée de quoi faire pour autoriser apache à lancer cette commande ?

Très cordialement
Patrick
 
WRInaute impliqué
Votre PHP est probablement en safe mode, ce qui empeche l'execution de commandes shell.

Vous pouvez débrancher le safe mode, mais alors là, attention à la sécurité...
 
WRInaute impliqué
Alors exec_shell devrait marcher...

Avez vous testé avec d'autres commandes shell?

Pour faire kill alll il faut etre root non? Le sript PHP n'a probablement pas les privilèges de root.
 
WRInaute discret
Merci Vap,

Oui, j'ai testé d'autres commandes, comme par exemple 'ls' et ma variable contient alors le listing de mon répertoire, donc cette commande marche mais pas pour le killall

j'ai aussi testé la commande 'ps...' qui permet de voir les process en cours, et le process qui m'intéresse n'est pas dans la liste, ce qui confirme qu'apache n'a pas les droits de voir le process et ne faire une commande dessus

Il faut être root, c'est d'ailleurs le but de la commande 'sudo' qui permet à apache de se présenter comme root

C'est clair à 99% que c'est un problème de droits, qu'il faut dire au moteur qu'apache a ce droit mais comment.....

La sécurité n'est pas un souci, le serveur appartient au client et il n'héberge que son application

Patrick
 
WRInaute impliqué
J'essaierai la chose suivante:

Je ferais une page PHP qui n'a pour but que de faire le kill all. Et cette page devrait avoir root comme propriétaire. Je ne sais pas si ce serait suffisant.

Mais d'une manière générale, c'est rassurant qu'on ne puisse pas facilement détruire tous les process depuis PHP...

Avez vous essaye exec au lieu de shell_exec ?

Vap
 
WRInaute passionné
Hello,

ne pouvez vous pas directement relancer l'application proprement, plutôt que de tenter directement la méthode "barbare" ?

Sinon le fait de mettre root en propriétaire d'une page web ne change (heureusement) rien quand à l'utilisateur faisant tourner tout cela. Et suexec a tendance à interdire le compte root également.

En shell essayez de basculer sous le même compte que PHP et d'essayer d'exécuter les commandes en question ; vous verrez bien ce que ça donne.
Et si cela coince toujours, depuis PHP ajoutez ' 2>&' à la fin de la commande exécutée (afin de récupérer le canal d'erreur) ; ou bien utilisez proc_open() qui permet de gérer correctement le canal d'erreur.
 
WRInaute discret
Merci Vap, tout a été testé, toutes les commandes php le permettant ...

Bool, merci de ta réponse
Lorsqu'on identifie le user comme apache et qu'on demande les process en cours, ils n'apparaissent pas, donc apache n'a pas le droit de les voir

Pour le moment, on est arrivé à lancer la commande, le process est bien stoppé, mais la page php boucle sans fin ...
On va essayer ta méthode '2>&' et proc_open pour voir si ce bouclage correspond en fait à une erreur

Patrick
 
WRInaute passionné
Un killall peut être long à répondre, il n'y a rien d'anormal à cela.

Avec proc_open il devrait par contre y avoir moyen de lancer le processus via un nohup, et ainsi de ne pas avoir à attendre la fin du traitement.
Dans tous les cas il y a très certainement un moyen plus "propre" de relancer ou recharger la configuration de l'application en question.
 
WRInaute discret
Pour le moment, on arrive à lancer un batch qui semble faire le boulot, une fois qu'on a lancé le script en php et qu'on vérifie l'id du process, il a bien changé ... donc c'est rapide et ça marche, mais la page en php qui a lancé la commande attend..... on va essayer avec proc_open en disant au script de ne rien attendre en retour

Je ne doute pas qu'il y a une méthode plus propre mais je ne connais pas tous les paramètres, j'essaie d'aider un technicien qui travaille pour le client...
 
WRInaute discret
héhéhé moi non plus si je devais héberger un site dessus mais ici c'est un serveur qui appartient au client, pas sur internet donc en local et il héberge uniquement sa propre application, donc aucun risque ...

Finalement on a trouvé la finale, on utilise popen qui n'attend pas la fin et tout fonctionne bien

Merci de vos conseils

Patrick
 
Discussions similaires
Haut