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


PHP - Verify if a program is running

我在家里组装并配置了一个使用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官方存储库安装。

我通过更改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*/
 }

我也遇到了同样的问题,但主要是因为重新启动崩溃的服务器。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