5

「psaux|greputilities」の結果を実行してテキストファイルにパイプし、テキストファイルをチャウニングして、Webサービスがファイルを読み取って結果をWebアプリに表示できるようにするシステムスクリプトがあります。

生の結果の例を次に示します。

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

あなたの何人かはこれのためのエレガントな解決策を投稿できますか?私は物事を行うためのより良い方法を学ぼうとしています、そしてガイダンスをいただければ幸いです。

4

3 に答える 3

1

preg_split代わりに使用explodeして分割することもできます[ ]+(1 つ以上のスペース)。しかし、私はこの場合、あなたが行ってpreg_match_allキャプチャすることができると思います:

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];
于 2013-01-02T16:21:02.197 に答える
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
)

$testexec からの出力と等しくなるように設定できます。探している値は、 のif下のステートメントにありforeachます。$matches[1]custx 値を持ちます。

于 2013-01-02T16:20:32.413 に答える
0

値の間の行のスペースの数が可変の場合、次を使用できますpreg_split

次のように変更するだけです。

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

に:

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

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

次に、最後から 2 番目のアイテムを次のように取得できます。

$txt = $userProcess[count($userProcess) - 2];
于 2013-01-02T16:21:56.317 に答える