使用perl中的条件停止进程

时间:2013-07-19 19:05:36

标签: linux perl debugging open-source

我在下面问了下面的问题,我找到了一个非常接近的答案,但后来发现它不起作用。我在perl中使用管道。但在我通过管道达到我的状态之前,该功能已完成其运行。有没有办法在运行时检查非常精确的秒,以便在10香蕉通过后停止该过程

parse output and count number of times a string appears

你好我试过这个......但它不起作用......在我有机会阻止之前,这个过程已经完成了。是不是有任何东西可以实际控制pid过程的流程。我的意思是,在发现10个香蕉完成之前,已经过了23个香蕉。我猜管道流量比实际过程慢

我想要做的就是在已经运行的进程中添加延迟。喜欢: 我们可以说我们知道输出会是什么样子: 命令1出 命令2出 香蕉 现在我可以解析香蕉并在此过程中延迟5秒。一旦我注入延迟,我就可以在那段时间运行我的perl脚本并及时停止脚本。

让我的问题清楚: 我写的代码:

my $pid = open my $pipe, '-|', 'commandA | tee banana.foo'
     or die "Error opening pipe from commandA: $!\n";
#  open my $pipe, 'commandA | tee result |'
#    or die "Error opening pipe from commandA: $!\n";
  print "$pid\n";
  my $n = 0;
  while (<$pipe>) {
    $n++ if /banana/;
    last if $n > 0;
    print "pipestring\n";
  }
  kill 'INT', $pid;
  close $pipe;  # kills the command with SIGPIPE if it's not done yet

  if ($n eq 1)  {

  print "commandA printed 'banana'\n";
  }
  else
  {
    print "nothing happened\n";
  }

banana.foo ( actual result )   |  banana.foo (expected result)
one                            |  one
two                            |  two 
three                          |  three 
banana                         |  banana
four
five

所以我不想要最后2个值并希望程序停止。 commandA是:

echo one
echo two
echo three
echo banana
echo four
echo five

重要编辑:我认为我将要创建一个调试器。有人可以使用任何开源调试器或其他控制进程的代码。

2 个答案:

答案 0 :(得分:1)

您尝试做的事情永远不会可靠地工作:commandA进程将数据写入文件与另一个尝试杀死它的进程之间始终存在竞争。由于两个进程之间有几个缓冲阶段,因此编写进程很可能在它被杀之前产生大量额外输出。

我能想到避免这种情况的唯一方法是:

  1. 将终止条件检查(打印10“香蕉”后停止)移动到产生输出的程序。这样,你根本不需要杀掉它。

  2. 打印每行后,生成输出的程序是否等待来自其他程序的某种确认。这是可能的,但相当棘手,可能效率低下。

  3. 使用控制程序(检查终止条件的程序)而不是使用tee,将数据写入输出文件,如下所示:

    open my $out, '> banana.foo'
         or die "Error opening banana.foo for writing: $!\n";
    
    my $pid = open my $pipe, 'commandA |'
         or die "Error opening pipe from commandA: $!\n";
    
    my $n = 0;
    while (<$pipe>) {
        print $out $_;
        $n++ if /banana/;
        last if $n > 0;
    }
    kill 'INT', $pid;
    close $pipe;
    

答案 1 :(得分:-2)

我正在编辑这篇文章,因为我显然误解了你的需要。

http://perldoc.perl.org/perlipc.html#Bidirectional-Communication-with-Another-Process

整个页面都有一些关于如何更好地控制子进程等的想法。