gpt4 book ai didi

perl - 我可以从 perl 中的进程捕获 STDOUT 写入事件吗?

转载 作者:行者123 更新时间:2023-12-01 12:11:16 25 4
gpt4 key购买 nike

我需要(愿意吗?)使用 Minion 从 Web 应用程序生成一个缓慢的进程队列。

过程-一个GLPK求解器 - 可以运行很长时间但会生成进度输出。

我想在输出发生时捕获它并将其写入某个地方(数据库?日志文件?),以便它可以作为网络应用程序内的状态更新回放给用户。

这可能吗?我不知道(因此没有代码)。

我正在探索 Capture::Tiny - 它的简单性很好,但我不知道它是否可以在写入时跟踪写入事件。

最佳答案

一个基本的方法是使用管道打开,在这里你open一个管道到一个被 fork 的进程。然后来自子项的 STDOUT 通过管道传输到父项中的文件句柄,或者父项通过管道传输到它的 STDIN

use warnings;
use strict;

my @cmd = qw(ls -l .); # your command

my $pid = open(my $fh, '-|', @cmd) // die "Can't open pipe from @cmd: $!";

while (<$fh>) {
print;
}

close $fh or die "Error closing pipe from @cmd: $!";

这样父级就可以在子级 STDOUT 发出时接收到它。

错误检查还可以做更多的事情,请参阅手册页,close , 和 $? in perlvar .此外,为 SIGPIPE 安装一个处理程序,参见 perlipc%SIG in perlvar .

有些模块可以更轻松地运行和管理外部命令,尤其是检查错误。然而,Capture::TinyIPC::Run3使用文件传输外部程序的流。

另一方面,IPC::Run给您更多的控制权和权力。

执行代码 "... each time some data is read from the child"使用回调

use warnings;
use strict;

use IPC::Run qw(run);

my @cmd = (
'perl',
'-le',
'STDOUT->autoflush(1); for (qw( abc def ghi )) { print; sleep 1; }'
);

run \@cmd, '>', sub { print $_[0] };

一旦你使用了IPC::Run,就可以有更多的可能,包括更好的错误审讯,为进程设置伪tty等等。例如,使用>pty> 而不是 > 设置了类似终端的环境,因此运行的外部程序可能会返回行缓冲并提供更及时的输出。如果对如何管理流程的需求变得更加复杂,那么使用该模块可以更轻松地开展工作。

感谢ikegami征求意见,包括演示 @cmd


为了证明父级在子级 STDOUT 发出时接收到它,请使用发出延迟输出的命令。例如,上面的 ls -l 使用

my @cmd = (
'perl',
'-le',
'STDOUT->autoflush(1); for (qw( abc def ghi )) { print; sleep 1; }'
);

这个 Perl 单行代码间隔一秒打印单词,这就是它们在屏幕上的结束方式。

关于perl - 我可以从 perl 中的进程捕获 STDOUT 写入事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51701670/

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