web-dev-qa-db-fra.com

Comment vérifier si le PID spécifié est en cours d'exécution sans appeler ps de PHP?

Nous aimerions vérifier si un processus spécifié est en cours d'exécution via PHP.

Nous aimerions simplement fournir un PID et voir si celui-ci 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 à partir de la sortie "ps"?

31
anonymous-one

Si vous êtes sur Linux, essayez ceci:

if (file_exists( "/proc/$pid" )){
    //process with a pid = $pid is running
}
66
Nasreddine

posix_getpgid($pid); retournera false lorsqu'un processus n'est pas en cours d'exécution

34
Wandering Zombie

Si vous voulez avoir une fonction pour cela alors:

$running = posix_kill($pid,0);

Envoyez le signal au processus avec l'identifiant de processus pid.

Appeler posix_kill avec le signal de suppression 0 renverra true si le processus est en cours d'exécution, false sinon.

14
Steel Brain

J'appellerais un script bash en utilisant Shell_exec

$pid = 23818;
if (Shell_exec("ps aux | grep " . $pid . " | wc -l") > 0)
{
    // do something
}
3
Pierre-Olivier

Je pense que posix_kill(posix_getpgrp(), 0) est le meilleur moyen de vérifier si le PID est en cours d’exécution, il est uniquement disponible sur les plates-formes Windows.

Il en va de même pour kill -0 PID sur le shell et Shell_exec('kill -0 PID') sur PHP, mais la sortie NO ERROR lorsque pid n'existe pas.

Dans le processus fils forké, le posix_getpgid renvoie toujours le pid du parent, même si le parent a été résilié.

<?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");
}
1
consatan

j'ai fait un script pour cela, lequel im utilise WordPress pour afficher l'état du serveur de jeu, mais cela fonctionnera avec tous les processus en cours

<?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'informations ici http://umbru.ch/?p=328

0
Sven Lauber

Voici comment nous le faisons:

if (`ps -p {$pid} -o comm,args=ARGS | grep php`) {

  //process with pid=$pid is running;
}
0
Denis Matafonov
//For Linux
$pid='475678';
exec('ps -C php -o pid', $a);
if(in_array($pid, $a)){
    // do something...
}
0
Vitaliy Kornienko