如何在不从PHP调用ps的情况下检查指定的PID当前是否正在运行?

时间:2012-03-26 14:45:44

标签: php process pid

我们想检查当前是否通过PHP运行指定的进程。

我们想简单地提供一个PID并查看它当前是否正在执行。

PHP是否有内部函数可以提供这些信息,还是我们必须从“ps”输出中解析它?

9 个答案:

答案 0 :(得分:67)

如果您使用的是Linux,请尝试以下操作:

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

答案 1 :(得分:36)

当进程未运行时,

posix_getpgid($pid);将返回false

答案 2 :(得分:14)

如果你想拥有它的功能,那么:

$running = posix_kill($pid,0);
  

使用进程标识符pid将信号sig发送到进程。

如果进程正在运行,则使用0 kill信号调用posix_kill将返回true,否则将返回false

答案 3 :(得分:3)

我会使用shell_exec

调用bash脚本
$pid = 23818;
if (shell_exec("ps aux | grep " . $pid . " | wc -l") > 0)
{
    // do something
}

答案 4 :(得分:1)

我认为posix_kill(posix_getpgrp(), 0)是检查PID是否正在运行的最佳方法,它仅在Windows平台上不可用。

它与shell上的kill -0 PID相同,而PHP上的shell_exec('kill -0 PID')相同,但当pid不存在时,NO ERROR输出也是如此。

在分叉子进程中,即使父进程被终止,posix_getpgid也会返回父进程的pid。

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

答案 5 :(得分:0)

我已经为此完成了一个脚本,我在wordpress中使用它来显示游戏服务器状态,但这将适用于服务器上的所有正在运行的进程

&#13;
&#13;
<?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");
?>
&#13;
&#13;
&#13;

此处提供更多信息http://umbru.ch/?p=328

答案 6 :(得分:0)

//For Linux
$pid='475678';
exec('ps -C php -o pid', $a);
if(in_array($pid, $a)){
    // do something...
}

答案 7 :(得分:0)

以下是我们的工作方式:

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

  //process with pid=$pid is running;
}

答案 8 :(得分:0)

$pid = 12345;
if (shell_exec("ps ax | grep " . $pid . " | grep -v grep | wc -l") > 0)
{
    // do something
}