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

问题描述 投票:32回答:9

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

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

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

php process pid
9个回答
67
投票

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

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

37
投票

当进程未运行时,posix_getpgid($pid);将返回false


14
投票

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

$running = posix_kill($pid,0);

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

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


3
投票

我会使用shell_exec调用bash脚本

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

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

0
投票

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

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

更多信息,请访问http://umbru.ch/?p=328


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

0
投票

我们是这样做的:

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

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

0
投票
$pid = 12345;
if (shell_exec("ps ax | grep " . $pid . " | grep -v grep | wc -l") > 0)
{
    // do something
}
© www.soinside.com 2019 - 2024. All rights reserved.