我在家里组装并配置了一个使用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