我在下面问了下面的问题,我找到了一个非常接近的答案,但后来发现它不起作用。我在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
重要编辑:我认为我将要创建一个调试器。有人可以使用任何开源调试器或其他控制进程的代码。
答案 0 :(得分:1)
您尝试做的事情永远不会可靠地工作:commandA
进程将数据写入文件与另一个尝试杀死它的进程之间始终存在竞争。由于两个进程之间有几个缓冲阶段,因此编写进程很可能在它被杀之前产生大量额外输出。
我能想到避免这种情况的唯一方法是:
将终止条件检查(打印10“香蕉”后停止)移动到产生输出的程序。这样,你根本不需要杀掉它。
打印每行后,生成输出的程序是否等待来自其他程序的某种确认。这是可能的,但相当棘手,可能效率低下。
使用控制程序(检查终止条件的程序)而不是使用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
整个页面都有一些关于如何更好地控制子进程等的想法。