gpt4 book ai didi

linux - 在 perl 中停止具有条件的进程

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:13:03 25 4
gpt4 key购买 nike

我在下面问了以下问题,我找到了一个非常接近的答案,但后来意识到它不起作用。我在 perl 中使用管道。但是在我什至通过管道达到我的条件之前,该功能就完成了它的运行。有没有一种方法可以在运行时在非常精确的秒内进行检查,以在 10 根香蕉通过后停止该过程

parse output and count number of times a string appears

你好,我试过了……但它不起作用……在我有机会停止它之前,这个过程就已经完成了。没有什么可以实际控制进程流的pid。我的意思是,在它发现 10 个香蕉已经完成之前,已经有 23 个香蕉交叉了。我猜管道流量比实际过程慢

我想做的就是在已经运行的进程中添加一个延迟。喜欢:假设我们知道输出会是什么样子:命令 1 输出命令 2 输出香蕉现在我可以解析香蕉并在此过程中延迟 5 秒。一旦我注入(inject)延迟,我就可以在那个时间运行我的 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

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

最佳答案

您尝试做的事情永远不会可靠地工作: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;

关于linux - 在 perl 中停止具有条件的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17753672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com