2014-10-08 7 views
0

Я собрал и настроил мини-сервер дома, на котором запущен Debian GNU/Linux с Apache. Я также установил видеоигр с открытым исходным кодом Teeworlds, чтобы запустить выделенный сервер.PHP - Проверьте, запущена ли программа

Моя идея - показать некоторую информацию о статусе сервера на моем веб-сайте, используя 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

Почему вы не можете избежать двойных кавычек в аргументе exec? –

+0

@JamesHunt Я действительно забыл об этой возможности! Мне так глупо! Я попробую. –

+0

@JamesHunt побег для работы с двойными кавычками: я напечатал команду в виде строки, и результат правильный. Но оба значения $ output и $ return всегда одинаковы независимо от фактического состояния процесса. –

ответ

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

P.S. Работает для серверов Teeworlds версии 0.6.X

Смежные вопросы