2012-03-07 4 views
0

Я пишу веб-страницу в php, которая предоставит некоторые полезные инструменты и информацию, связанную с сервером minecraft. Я работаю над «индикатором состояния», системой, чтобы обнаружить, что с сервером что-то не так. Одной из частей этой системы является использование shell_exec для проверки наличия серверного приложения в системе. Я использую preg_match, чтобы проверить, показывает ли результат shell_exec, что работает серверное приложение. Проблема в том, что независимо от того, что я делаю, preg_match, похоже, всегда возвращает false, что указывает на то, что произошла ошибка. Я не могу найти никаких подробностей о том, что именно может быть этой ошибкой.preg_match возвращает false

function get_server_app_status($appName) 
{ 
    if (preg_match($appName, shell_exec('ps aux | grep ' . $appName . ' | grep -v grep')) != 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Я проверил, что shell_exec возвращает то, что я хочу, чтобы по толкая его в переменную и проверять это значение с помощью отладчика, а также проверки $ APPNAME. Оба являются строками и имеют значения, которые я им хочу. Я также проверил, что preg_match возвращает то же самое, и возвращает false, а не только ноль.

+0

Вы можете предоставить нам часть своего кода? –

+0

просто для подтверждения, это вернет true, если строка, которую вы пытаетесь сопоставить, находится в начале строки ввода – JamesHalsall

+1

. Вы можете найти более сжатый способ записи 'if (boolean_expression) {return true; } else {return false; } '... –

ответ

1

Я тестировал возвращаемое значение для NULL. И это работало отлично

function get_server_app_status($appName) 
{ 
    $result = shell_exec('ps aux | grep ' . $appName . ' | grep -v grep'); 
    if (!is_null($result)) { 
     // app is running 
    } else { 
     // app is NOT running 
    } 
} 
+0

Не будет ли shell_exec возвращать хотя бы символ новой строки? Но я тоже попробую. – Surma

+0

По-видимому, нет, это работает безупречно. Я бы добавил +1, но, видимо, мне нужно +15 сделать это. – Surma

+0

Вы можете принять, если он сработает для вас. @Surma –

6

В фрагменте кода:

if (preg_match($appName, shell_exec(... 

является $appName действительным регулярное выражение?

Вы, вероятно, имел в виду что-то вроде:

if (preg_match("/" . preg_quote($appName) . "/", shell_exec(... 

Но если $appName это просто строка, то вы будете лучше всего с помощью функции сравнения строк, чем регулярное выражение, как strcmp или strpos или даже ==.

+0

+1 это - обратите внимание, что хотя' grep' использует ограниченную форму регулярного выражения для своего фильтра (POSIX regex), он не использует той же формы регулярного выражения PCRE, используемого функциями 'preg_ *' PHP. По крайней мере, он должен быть инкапсулирован в разделители (например, '/'), как это предлагается в этом ответе, и может потребоваться и другие преобразования.Вы можете получить некоторую радость от использования 'ereg()' вместо этого, хотя это устарело и ** NOT ** рекомендуемый подход. Если все, что вам нужно сделать, это искать определенную статическую строку в выводе, тогда 'strpos()' определенно лучший вариант. – DaveRandom

+0

Должен ли я включать что-нибудь помимо строки, чтобы получить правильное регулярное выражение? Huh, и я думал, что это сработало так же, как Unix grep ... – Surma

2

Если $appName является строка, а не регулярное выражение, просто использовать strpos:

 
function get_server_app_status($appName) { 
    return strpos($appName, shell_exec('ps aux | grep ' . $appName . ' | grep -v grep')) !== false; 
} 
+0

Пробовал это, strpos возвращает false.http: //pastebin.com/VXL1hrkD – Surma

+0

Также значения двух переменных: $ appName установлены в craftbukkit.jar и $ Значение shExecResult равно 9422 4.3 12.7 1250348 259152 pts/2 Sl + 00:35 36:24 java -Xincgc -Xmx1024M -jar craftbukkit.jar nogui \ n – Surma

1

Вот альтернатива, которая использует «pgrep» при наличии на среде сервера.

<?php 
function get_server_app_status($appName) { 
    return shell_exec("pgrep $appName"); 
} 

// Test driver 
echo sprintf("Running:%s".PHP_EOL, (get_server_app_status('httpd'))?'Yes':'No'); 
echo sprintf("Running:%s".PHP_EOL, (get_server_app_status('java'))?'Yes':'No'); 

Вот результаты тестирования для httpd и несуществующего случая.

[work]$ ./5 proc.php 
Running:Yes 
Running:No 

Примечание: ./5 является символической ссылкой на мой двоичный файл PHP.

+0

Проблема в том, что серверное приложение называется java, и у меня работает более одного серверного приложения, один bukkit и один ваниль (которые поэтому имеют разные имена файлов). Если я хочу добавить другое, я могу просто использовать другое имя файла. – Surma

+0

Ох. Последние две строки - это всего лишь мои тестовые примеры. Замените любую программу, которую вы ожидаете найти. – JTP

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