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