Comment vérifier si le PID spécifié est en cours d'exécution sans invoquer ps à partir de PHP?
nous aimerions vérifier si un processus spécifié est actuellement exécuté via PHP.
nous aimerions simplement fournir un PID et voir s'il est en cours d'exécution ou non.
est-ce que PHP a une fonction interne qui nous donnerait cette information ou devons-nous l'analyser en sortie "ps"?
8 réponses
si vous êtes sous Linux, essayez ceci:
if (file_exists( "/proc/$pid" )){
//process with a pid = $pid is running
}
posix_getpgid($pid);
retournera false quand un processus n'est pas en cours d'exécution
si vous voulez avoir une fonction pour elle alors:
$running = posix_kill($pid,0);
envoyer le sig de signal au processus avec l'Identificateur de processus pid.
Appel posix_kill
avec le 0 de tuer le signal de retour true
si le processus est en cours d'exécution, false
dans le cas contraire.
j'appellerai un script bash en utilisant shell_exec
$pid = 23818;
if (shell_exec("ps aux | grep " . $pid . " | wc -l") > 0)
{
// do something
}
je pense que posix_kill(posix_getpgrp(), 0)
est la meilleure façon de vérifier si PID est en cours d'exécution, il n'est seulement pas disponible sur les plates-formes Windows.
c'est la même chose que kill -0 PID
sur shell, et shell_exec('kill -0 PID')
sur PHP mais aucune sortie D'erreur lorsque le pid n'existe pas.
dans le processus forked child, le posix_getpgid
retour pid du parent toujours même si le parent a été terminé.
<?php
$pid = pcntl_fork();
if ($pid === -1) {
exit(-1);
} elseif ($pid === 0) {
echo "in child\n";
while (true) {
$pid = posix_getpid();
$pgid = posix_getpgid($pid);
echo "pid: $pid\tpgid: $pgid\n";
sleep(5);
}
} else {
$pid = posix_getpid();
echo "parent process pid: $pid\n";
exit("parent process exit.\n");
}
j'ai fait un script pour cela, que j'utilise dans wordpress pour montrer l'état du serveur de jeu, mais cela fonctionnera avec tout le processus d'exécution sur le serveur
<?php
//##########################################
// desc: Diese PHP Script zeig euch ob ein Prozess läuft oder nicht
// autor: seevenup
// version: 0.2
//##########################################
if (!function_exists('server_status')) {
function server_status($string,$name) {
$pid=exec("pidof $name");
exec("ps -p $pid", $output);
if (count($output) > 1) {
echo "$string: <font color='green'><b>RUNNING</b></font><br>";
}
else {
echo "$string: <font color='red'><b>DOWN</b></font><br>";
}
}
}
//Beispiel "Text zum anzeigen", "Prozess Name auf dem Server"
server_status("Running With Rifles","rwr_server");
server_status("Starbound","starbound_server");
server_status("Minecraft","minecarf");
?>
plus d'information ici http://umbru.ch/?p=328
//For Linux
$pid='475678';
exec('ps -C php -o pid', $a);
if(in_array($pid, $a)){
// do something...
}
Voici comment nous procédons:
if (`ps -p {$pid} -o comm,args=ARGS | grep php`) {
//process with pid=$pid is running;
}