我的目标是启动一个正在进行的进程(例如 iostat)并解析一些信息。完成后,我想杀死 iostat 并优雅地关闭管道。请记住,iostat 将永远运行,直到我将其杀死。
如果我尝试在关闭管道之前终止该进程,则 close() 将返回 -1 表示“没有子级”。如果我在关闭管道之前没有终止进程,它会返回 13,因为 iostat 仍在尝试写入我的管道。换句话说,这个脚本总是会死掉()。
如何优雅地关闭此管道?
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;