2013-01-02 5 views
5

"ps aux | grep utilities"の結果をテキストファイルにパイプしてテキストファイルをパイプして、Webサービスがファイルを読み込んで結果をWebアプリケーションに表示できるようにするシステムスクリプトがあります。ここで ps auxを解析するPHP | grep ...結果

は、生の結果の一例である:

user  12052 0.2 0.1 137184 13056 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron 
user  12054 0.2 0.1 137184 13064 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron 
user  12055 0.6 0.1 137844 14220 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron 
user  12057 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron 
user  12058 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron 
user  12059 0.3 0.1 135112 13000 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron 
root  12068 0.0 0.0 106088 1164 pts/1 S+ 10:00 0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt 
root  12070 0.0 0.0 103240 828 pts/1 R+ 10:00 0:00 grep utilities 

私のPHPスクリプトは、このテキストファイルを解析すると、私は、次の(単なる例)を抽出する必要があります。

cust1 
cust3 
cust4 
cust89 
cust435 
cust16 

私が持っていますさまざまな不器用な方法を試したが、何もうまくいかないようだ。私が以下に列挙したやり方はうまくいくが、行の "スペース"の数が変化して爆発するため、たまにゴミ箱をつかむこともある。

public function showProcesses() { 
    $lines = file(DIR_LOGGER_ROOT . "dashboard/currentlyPosting.txt"); 
    $results = array(); 
    $i = 0; 
    foreach($lines as $line) { 
     if (preg_match("/php/i", $line)) { 
      $userProcess = explode(" ", $line); 
      if($userProcess[29] != "0:00" && strlen($userProcess[29]) < 20) { 
       $results[$i] = $userProcess[29]; 
       $i++; 
      } 
     } 
    } 
    return $results; 
} 

あなたの中には、このような優雅なソリューションを投稿できますか?私は、より良いやり方を学び、指導に感謝しています。

+0

あなたがこれを行うには、コマンドラインアプリケーションを書いている場合は、私はPerlのような文字列処理や正規表現に適した言語を使用することをお勧め:

次に、あなたが持つ最後から二番目のアイテムを得ることができます。おそらくCPAN上で何かを見つけて、プロセステーブルに直接アクセスすることもできます。たとえば、http://search.cpan.org/dist/Proc-ProcessTable/ –

+0

のようにデータが収集され、システムスクリプトからテキストファイルに書き込まれます。私のWebアプリケーションからexecとrootを使わずにテキストファイルをWebアプリケーションにアクセスできるようにします。結果を解析するのはWebアプリケーション自体のためであり、PHPは理にかなっています。 –

答えて

0

私はpreg_match()を使用します。私はシステム管理スクリプトの多くで同様のことをしています。

$test = "user  12052 0.2 0.1 137184 13056 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron 
user  12054 0.2 0.1 137184 13064 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron 
user  12055 0.6 0.1 137844 14220 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron 
user  12057 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron 
user  12058 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron 
user  12059 0.3 0.1 135112 13000 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron 
root  12068 0.0 0.0 106088 1164 pts/1 S+ 10:00 0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt 
root  12070 0.0 0.0 103240 828 pts/1 R+ 10:00 0:00 grep utilities"; 

$lines = explode("\n", $test); 

foreach($lines as $line){ 
     if(preg_match("/.php[\s+](cust[\d]+)[\s+]cron/i", $line, $matches)){ 
       print_r($matches); 
     } 

} 

上記プリント:

Array 
(
    [0] => .php cust1 cron 
    [1] => cust1 
) 
Array 
(
    [0] => .php cust3 cron 
    [1] => cust3 
) 
Array 
(
    [0] => .php cust4 cron 
    [1] => cust4 
) 
Array 
(
    [0] => .php cust89 cron 
    [1] => cust89 
) 
Array 
(
    [0] => .php cust435 cron 
    [1] => cust435 
) 
Array 
(
    [0] => .php cust16 cron 
    [1] => cust16 
) 

あなたがEXECからの出力を等しく$testを設定することができ、ここでの例です。探している値は、のifステートメントに記載されています。 $matches[1]はcustx値を持ちます。

1

explodeの代わりにpreg_splitを使用し、[ ]+(1つ以上のスペース)に分割することができます。しかし、私はあなたがpreg_match_allcapturingで行くことができ、この場合だと思う:

preg_match_all('/[ ]php[ ]+\S+[ ]+(\S+)/', $input, $matches); 
$result = $matches[1]; 

パターンは、スペースと一致するphp、より多くのスペース、非スペース(パス)の文字列を、より多くのスペース、そしてキャプチャスペースのない次の文字列。最初のスペースは、ユーザー名の一部としてphpと一致しないようにすることがほとんどですが、実際にはコマンドとしてのみです。

キャプチャの代わりに、PCREの「保持」機能があります。あなたがパターンで\Kを使用している場合、それは試合中に破棄される前に、すべてのもの:値の間にあなたの行のスペースの数が可変である場合

preg_match_all('/[ ]php[ ]+\S+[ ]+\K\S+/', $input, $matches); 
$result = $matches[0]; 
0

、あなたはあなただけだろうpreg_split

を使用することができます変更するには:

$userProcess = explode(" ", $line); 

へ:

$userProcess = preg_split("#\s+#", $line); 

\s+は、1つ以上のスペース、タブまたはその他の空白文字と一致します。

$txt = $userProcess[count($userProcess) - 2]; 
関連する問題