2

私の目標は、進行中のプロセス (iostat など) を起動し、いくつかの情報を解析することです。完了したら、iostat を強制終了し、パイプを適切に閉じたいと思います。覚えておいてください、iostat は私がそれを強制終了するまで永久に実行されます。

パイプを閉じる前にプロセスを強制終了しようとすると、close() は「子なし」に対して -1 を返します。パイプを閉じる前にプロセスを強制終了しないと、13 が返されます。これは、iostat がまだパイプに書き込もうとしているからです。つまり、このスクリプトは常に die() になります。

このパイプを適切に閉じるにはどうすればよいですか?

use warnings;
use strict;

my $cmd = "iostat 1";
my $pid = open(my $pipe, "$cmd |") || die "ERROR: Cannot open pipe to iostat process: $!\n";
my $count = 0;

while (<$pipe>){
  if ($count > 2){ 
    kill(9, $pid);    # if I execute these two lines, close() returns -1
    waitpid($pid, 0); # otherwise it returns 13
    last;
  }
  $count++;
}
close($pipe) || die "ERROR: Cannot close pipe to iostat process: $! $?\n";
exit 0;
4

2 に答える 2