【发布时间】:2013-07-19 19:05:35
【问题描述】:
我在下面问了以下问题,我找到了一个非常接近的答案,但后来意识到它不起作用。我在 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 个值并希望程序停止。 命令A是:
echo one
echo two
echo three
echo banana
echo four
echo five
重要编辑:我想我要做的是创建一个调试器。有人拥有任何开源调试器或其他控制进程的代码。
【问题讨论】:
-
你没有显示你运行的代码。如果您运行此处显示的内容,“管道字符串”将打印 3 次,然后是“commandA 打印香蕉”消息。而且你的散文似乎指的是代码甚至没有暗示的东西......
-
我建议你重新考虑你的方法。通常,您无法对进程执行的时间进行太多控制,并且必须在它认为方便时为您提供处理器时间的操作系统提供弹性。
标签: linux perl debugging open-source