0

ps -efコマンドの結果を取得しようとしていますが、 1 つの問題が発生しています。

$cmd完全なコマンドを出力せず、コマンド引数間のスペースで分割するだけです。

これを出力します:

jill 61745 8888 0 11:03 ? 00:00:04 php-fpm:

これを印刷する必要がある場合:

jill 61745 8888 0 11:03 ? 00:00:04 php-fpm: pool www

正規表現がこれを達成できることは知っていますが、正確に何をすべきかは明確ではありません。

sub refresh {
        open(OPENPIPE, "ps -ef|");
        while (<OPENPIPE>) {
                my ($uid, $pid, $ppid, $c, $stime, $tty, $time, $cmd) = split();
                print "$uid $pid $ppid $c $stime $tty $time $cmd\n";
        }
        close(OPENPIPE);
}
refresh();
4

2 に答える 2

4

ドキュメントを読んでください!split には、結果のフィールドの数を制限する 3 番目の引数があります。必要なフィールドの数に設定します。

my @fields = split ' ', $_, 8;

openまた、字句ファイルハンドルとエラー処理で の 3-arg-form を使用するのも良い習慣です:

my @command = ("ps", "-ef");
open my $pipe, '-|', @command or die "Can't run @command: $!";
while (<$pipe>) {
  chomp;
  ...;
}
close $pipe or warn
  $! ? "Error when closing @command: $!"
     : "Return status $? from @command";
于 2013-04-13T16:09:52.717 に答える