PHP - 验证程序是否正在运行

时间:2014-10-08 09:26:51

标签: php linux process debian open-source

我在家里组装并配置了一个使用Apache运行Debian GNU / Linux的迷你服务器。我还安装了开源视频游戏Teeworlds以运行专用服务器。

我的想法是使用Apache和PHP在我的网站上显示有关服务器状态的一些信息。最重要的功能是显示服务器是否正在运行。

我最初尝试使用 pgrep 命令可以正常使用多个进程,但不是我的情况:

<?php exec("pgrep process_name", $output, $return);
  if ($return == 0) {
    /*Service is running*/
  }
  else{
    /*Service is not running*/
  }
?>

接下来我发现这可以在终端中使用:

ps -ef | awk '$8=="/usr/games/teeworlds-server" {print $2}'

但是我不能在PHP exec命令中使用它,因为这个字符串使用双引号(它不会使用这个单引号)。

有没有其他方法可以使用PHP检查进程的状态?或者我做错了什么?

注意:游戏已从官方Debian存储库安装。

2 个答案:

答案 0 :(得分:0)

我通过更改 exec 命令解决了这个问题:

exec("ps -ef | awk '$8==\"/usr/games/teeworlds-server\" {print $2}'", $output, $return)

shell_exec

 $test= shell_exec("ps -ef | awk '$8==\"/usr/games/teeworlds-server\" {print $2}'");
 if ($test>0) {
   /*Server is running*/
 }
 else{
   /*Server is not running*/
 }

答案 1 :(得分:0)

我遇到了同样的问题,但主要用于重启崩溃的服务器。 Teeworlds服务器可以回复一些传入的数据包,例如,它告诉服务器浏览器的服务器信息。因此,如果服务器为我们的请求发送响应,它就会存活。我使用了这个php函数:

function is_alive($port) {
    $socket = stream_socket_client('udp://localhost:'.$port , $errno, $errstr, 3); 
    fwrite($socket, "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x69\x65\x33\x05");
    $response = fread($socket, 2048);
    return (!$errno && $response);
}

简单的使用示例:

$servers = array(); //you may have many servers with different ports
$servers[1] = 8302;
$servers[2] = 1234;
$servers[3] = 8308;
$servers[4] = 8000;

// checking every server
foreach ($servers as $servernumber => $port) {
    echo "checking server ".$servernumber." ...";
    if (!is_alive($port)) {
        echo " not running/responding ...";
    }
    echo "\n";
}

<强> P.S。适用于Teeworlds服务器版本0.6.X