2012-03-07 10 views
0

私は、ミニクラフトサーバーに関連する便利なツールと情報を提供するWebページをphpで作成しています。私は "状態インジケータ"、サーバーに何か問題があるかどうかを検出するシステムに取り組んでいます。このシステムの一部の1つは、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が返すのと同じ方法をチェックして、偽ではなくゼロを返します。あなたのコードスニペットで

+0

あなたのコードをいくつか教えていただけますか? –

+0

これは、一致する文字列が入力文字列の先頭にある場合にのみtrueを返します。 – JamesHalsall

+1

'if(boolean_expression){trueを返します。 } else {return false; } '... –

答えて

1

は、私が実際にNULLの戻り値をテストした:

+0

少なくとも改行文字を返しませんか?しかし、私もこれを試してみます。 – 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あるいは==のように、正規表現よりも、文字列比較関数を使用したほうが良いでしょう。

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

+1これは、' grep'はフィルター(POSIX正規表現)の正規表現の限定された形式を使用していますが、 PHPの 'preg_ *'関数で使用されるPCRE正規表現と同じ形式です。非常に最小限では、この答えで示唆されている区切り文字( '/'など)にカプセル化する必要があります。また、他の変換も必要になることがあります。代わりに 'ereg()'を使用することから幾分かの喜びを得るかもしれませんが、推奨されていません。出力で特定の静的な文字列を探すだけでよいのであれば、 'strpos()'は間違いなく良いオプションです。 – DaveRandom

+0

有効な正規表現を得るために一致する文字列のほかに何かを含める必要がありますか?私はそれがUnixのgrepのように働いていると思っていました。 – Surma

2

$appNameの場合は、ちょうどstrposを使用し、文字列ではなく正規表現です。 そして、これは完全に

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

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で、複数のサーバーアプリケーションが実行されていて、1つのバケットと1つのバニラが異なるファイル名を持っていることです。私は別のファイル名を使用することができます別のを追加したい場合。 – Surma

+0

ああ。最後の2行は私のテストケースです。見つけようとしているプログラムに置き換えてください。 – JTP

関連する問題