2014-10-08 49 views
0

我組裝並配置了一臺運行Debian GNU/Linux的小型服務器。我還安裝了開源視頻遊戲Teeworlds以運行專用服務器。PHP - 驗證程序是否正在運行

我的想法是使用Apache和PHP在我的網站上顯示一些關於服務器狀態的信息。最重要的功能是顯示服務器是否正在運行。

我想先工作正常了許多過程,但不是在我的情況下,使用p纖ep命令:

<?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

爲什麼你不能在exec參數中轉義雙引號? – 2014-10-08 09:31:00

+0

@JamesHunt我真的忘了這種可能性!我覺得很愚蠢!我會試一試。 – 2014-10-08 09:35:29

+0

@JamesHunt雙引號的轉義工作原理:我將命令作爲字符串輸出,輸出正確。但是無論實際的進程狀態如何,$ output和$ return都是一樣的。 – 2014-10-08 09:50:39

回答

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*/ 
} 
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"; 
} 

附:適用於Teeworlds服務器版本0.6.X