2009-09-07 11 views
2

Je crée un processus en utilisant proc_open dans un script PHP.Comment terminer un processus

Comment mettre fin à ceci dans un autre script. Je ne suis pas en mesure de passer la ressource retournée par le proc_open.

J'ai également essayé d'utiliser proc_get_status(), il retourne le ppid. Je n'ai pas le pid des enfants.

env développement: WAMP

Toutes les entrées est apprécié.

+0

Je suppose: Il n'y a aucun moyen sans manipulation sur des informations de processus. – tuergeist

+0

@tuergeist plus ou moins, c'est vrai. Il est possible sur unix-likes d'ouvrir un tube à ce processus dès que vous l'ouvrez pour pouvoir le fermer plus tard, mais sur un système sans état comme PHP, vous perdez la référence au processus appelant sauf si vous utilisez session ou quelque chose de similaire. à la fin, vous devez garder une trace de quelque chose, donc vous savez comment fermer le proc. –

+0

Une mise à jour serait bien. –

Répondre

3

Je vous recommande de réexaminer votre modèle pour vous assurer que vous devez réellement tuer le processus d'ailleurs. Votre code deviendra de plus en plus difficile à déboguer et à maintenir dans toutes les circonstances sauf les plus triviales.

Pour le garder encapsulé, vous pouvez signaler le processus que vous souhaitez terminer et quitter avec élégance dans le processus que vous voulez tuer. Sinon, vous pouvez utiliser IPC normal pour envoyer un message qui dit: "hé, mon pote, arrête, s'il te plaît." Edit: pour le 2ème paragraphe, vous pouvez toujours lancer un script pour ce faire. C'est très bien. ce que vous voulez éviter est un type de tuer -9. Au lieu de cela, laissez le processus quitter gracieusement.

+0

La chose est que j'ai une page html avec des boutons de démarrage et d'arrêt. Le début va à un script appelé "start.php" où il crée un nouveau processus. Le bouton d'arrêt doit arrêter/terminer le processus. Comment puis-je faire cela ? Autant que je peux penser que la fonctionnalité d'arrêt doit être écrite dans un script séparé non? – Vidya

+0

Je ne pense pas. Vous avez une scession. Vous avez accès aux cookies vous avez accès au système de fichiers dans lequel vous pouvez écrire un fichier, etc. (en fait, ce dernier peut ne pas l'être, en fonction des paramètres de sécurité). Vous pouvez enregistrer le pid du processus étendu et le rappeler plus tard et utiliser les techniques que j'ai mentionnées ci-dessus. Je suis désolé de ne pas pouvoir vous donner la syntaxe exacte; Je cherche toujours ce genre de choses moi-même. –

+0

en fait, si tout est juste html statique à l'exception de quelques petits scripts PHP, scession est probablement hors de question. –

0

Vous pouvez utiliser un certain methond pour créer un processus, cette méthode renvoie généralement le PID du nouveau processus.

Cela fonctionne pour vous? :

$process = proc_open('php', $descriptorspec, $pipes, $cwd, $env); 
$return_value = proc_close($process); 
+0

$ processus ici est une ressource pas le pid. Je ne peux/ne peux pas passer à un autre script pour le terminer. – Vidya

+0

Il y a $ process.pid, que vous pourriez probablement utiliser. Vous pouvez l'écrire dans un fichier (pas efficace) ou l'envoyer par réseau à un autre processus ("script"). – bua

+0

$ process.pid renvoie "ID de ressource # 6pid". Qu'est-ce que je fais avec ça? – Vidya

0

Vous êtes mieux d'utiliser un outil comme celui-ci pour lancer votre autre processus:

$pid = shell_exec("nohup $Command > /dev/null 2>&1 & echo $!"); 

Qu'il y aurait exécuter le processus, et vous donner un identifiant de processus en cours d'exécution.

exec("ps $pid", $pState);  
$running = (count($pState) >= 2);  

à vous résiliez pouvez toujours utiliser

exec("kill $pid"); 

Cependant, vous ne pouvez pas tuer les processus non appartenant à l'utilisateur PHP fonctionne à - si elle fonctionne comme personne - vous allez commencer le nouveau processus comme personne , et seulement être en mesure de tuer les processus qui s'exécutent sous l'utilisateur personne.

+0

Non, j'ai besoin d'utiliser proc_open car j'ai besoin d'envoyer beaucoup de commandes dans une instance. – Vidya

2

Pour le faire en PHP pur, voici la solution:

posix_kill($pid, 15); // SIGTERM = 15 
Questions connexes