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"?

31
demandé sur kenorb 2012-03-26 18:45:44

8 réponses

si vous êtes sous Linux, essayez ceci:

if (file_exists( "/proc/$pid" )){
    //process with a pid = $pid is running
}
60
répondu Nasreddine 2012-03-26 15:02:00

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

33
répondu Wandering Zombie 2014-02-06 17:41:29

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.

12
répondu Steel Brain 2017-07-04 12:09:29

j'appellerai un script bash en utilisant shell_exec

$pid = 23818;
if (shell_exec("ps aux | grep " . $pid . " | wc -l") > 0)
{
    // do something
}
3
répondu Pierre-Olivier 2012-03-26 14:59:13

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");
}
1
répondu consatan 2017-02-14 03:27:50

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

0
répondu Sven Lauber 2015-04-18 11:14:38
//For Linux
$pid='475678';
exec('ps -C php -o pid', $a);
if(in_array($pid, $a)){
    // do something...
}
0
répondu Vitaliy Kornienko 2016-08-29 15:46:03

Voici comment nous procédons:

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

  //process with pid=$pid is running;
}
0
répondu Denis Matafonov 2018-05-23 17:51:15