私の目標は、進行中のプロセス (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;