【问题标题】:Perl terminate command on handle closePerl 在句柄关闭时终止命令
【发布时间】:2012-07-25 14:26:20
【问题描述】:

我有以下代码读取命令“some_command”的输出。 “some_command”是一个持续的过程,它会保持打印输出,直到它被杀死。我想知道如果我关闭文件句柄或最后调用,它是否也会终止“some_command”进程,或者“some_command”可能会继续作为孤立进程运行。我基本上想从命令中读取输出,直到找到 /Output/ 的行然后终止。

my $mycommand = 'some_command';
open IN, "$mycommand 123456 |" or die("Failed: $!");
while(my $line = <IN> && !$stop) {
    if($line =~ /Output/) {
       # work is done
       last;
       $stop = 1;
    }
}
close IN;  

【问题讨论】:

    标签: perl command


    【解决方案1】:

    close 在这种类型的句柄上将首先关闭管道,然后等待子进程退出。下一次尝试写入管道时,孩子将死于 SIGPIPE。如果您不想等待那么久,您可以加快处理速度并自行终止。

    my $pid = open ...;
    while (<IN>) {
        if (/Output/) {
           # work is done
           kill TERM => $pid;
           last;
        }
    
        print;  # Or whatever
    }
    
    close IN;
    

    (去掉$stop,因为你没有使用它。)

    【讨论】:

    • 在您上面提供的示例中,我不必调用 close IN?
    • @user1540909,我不是故意要忽略它。如果您没有明确关闭它,它将在退出时关闭。虽然......如果你使用包变量(如你所愿)而不是词法,Perl 中的一个不会修复的错误会导致 Perl 不会为孩子wait
    猜你喜欢
    • 2011-08-16
    • 2010-12-07
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多