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

2023-12-19

我需要(愿意?)使用以下方式从 Web 应用程序生成一个缓慢的进程Minion https://metacpan.org/pod/Minion queue.

该过程-aGLPK https://en.wikipedia.org/wiki/GNU_Linear_Programming_Kit求解器 - 可以运行很长时间但生成进度输出。

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

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

我在探索捕获::微小 https://metacpan.org/pod/Capture::Tiny- 它的简单性很好,但我不知道它是否可以在写入时跟踪写入事件。


一种基本方法是使用管道打开,您可以在其中open https://perldoc.perl.org/functions/open.html通往分叉进程的管道。然后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: $!";

This way the parent receives child's STDOUT right as it is emitted.

您可以对错误检查做更多的事情,请参阅手册页,close https://perldoc.perl.org/functions/close.html, and $?在佩尔瓦尔 https://perldoc.perl.org/perlvar.html#%24%3f。另外,安装一个处理程序SIGPIPE, see perlipc https://perldoc.perl.org/perlipc.html and %SIG在佩尔瓦尔 https://perldoc.perl.org/perlvar.html#%SIG.

有些模块可以使运行和管理外部命令变得更加容易,特别是检查错误。然而,捕获::微小 https://metacpan.org/pod/Capture::Tiny and IPC::运行3 https://metacpan.org/pod/IPC::Run3使用文件传输外部程序的流。

另一方面,IPC::Run https://metacpan.org/pod/IPC::Run为您提供更多的控制力和力量。

执行代码"...每次从孩子那里读取一些数据时" https://metacpan.org/pod/IPC::Run#Redirection-Operators使用回调

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 https://stackoverflow.com/users/589924/ikegami征求意见,包括演示@cmd.


To demonstrate that the parent receives child's STDOUT as it is emitted use a command that emits output with delays. For example, instead of ls -l above use

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

这个 Perl 一行行每隔一秒打印单词,这就是它们在屏幕上的显示方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以从 Perl 中的进程捕获 STDOUT 写入事件吗? 的相关文章

随机推荐

  • 检查数字的递归函数

    编写一个递归函数来检查数字中有多少位可以除以它们后面的数字 例子 84963应该返回 2 因为 8 可以除以 4 6 可以除以 3 我的函数似乎根本没有输出任何内容 include
  • 如何更改表列数据类型[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有以下专
  • 如何建立/模拟持续的 TCP 连接?

    看起来 WCF TCP 连接不是持久的 第一次 ping 回复需要一段时间 但后续过程花费的时间更少 过了一会儿 又需要很长时间 再次重新连接 服务器 gt 在 net tcp 0 0 0 0 999 上启动 CLIENT gt Conne
  • CSS 只适用于 Safari?

    是否可以添加一个我只想在 Safari 中显示而不是在其他浏览器中显示的 css 块 下面是一个示例 如果您的浏览器是 Safari 或 Chrome 两者共享通用的 Webkit 渲染引擎 则将网站的字体颜色设置为绿色 media scr
  • 自动调整 WebView 大小以适应内容

    我正在开发一个 Xamarin Forms PCL 项目 该项目以 WebView 的形式显示帖子 因此我添加了可点击的内容 例如主题标签 我遇到的问题是 WebView 无法适应其内容的大小 WebView 不加载实际站点我使用以下方法将
  • APC 不记得 CLI 中的缓存

    我正在使用以下命令设置 APC 缓存数组 apc add ips ips 通过命令行 可以通过以下方式检索此缓存数组 apc fetch ips 在同一个脚本中 但是 无法从后续 CLI 脚本或通过 Apache 调用的 PHP 访问它 虽
  • 什么时候 `new Error()` 比 `Error()` 更好?

    ES5 语言规范明确指出 http www ecma international org ecma 262 5 1 sec 15 11 1 that Error foo 做同样的事情new Error foo 但我注意到在野外 时间越长ne
  • 发布一对多关系

    我正在尝试通过 Django REST 框架向我的 Django 模型公开 API 我有一个对象Observation 一个观察可以包含多个已观察到的事物 所以我这样表示 class Observation models Model pho
  • 如何验证 EWS Java API

    我们正在使用 EWS Java API 在 Java 应用程序上使用 Outlook 日历 我在 EWS 上遇到身份验证问题 我在机架空间提供的云 Outlook 帐户上尝试了该应用程序 一切正常 因此我知道凭据是准确的 这是代码 impo
  • 在线性规划中将条件约束转换为线性约束

    我有两个变量 x gt 0 和 y 二进制 0 或 1 并且我有一个常数 z gt 0 如何使用线性约束来描述以下条件 If x z then y 1 else y 0 我试图通过定义另一个二元变量 i 和一个足够大的正常数 U 并添加约束
  • 反应式编程中流之间的循环依赖关系

    在涉足反应式编程时 我经常遇到两个流相互依赖的情况 解决这些案例的惯用方法是什么 一个最小的例子 有按钮 A 和 B 都显示一个值 单击 A 必须将 A 的值增加 B 单击 B 必须将 B 的值设置为 A 我能想到的第一个解决方案 F 中的
  • 我如何模拟 sqlite3.Cursor

    我一直在绞尽脑汁试图找出如何嘲笑sqlite3 Cursor类具体为fetchall method 考虑以下代码示例 import sqlite3 from mock import Mock patch from nose tools im
  • Pandas:isin() 和 str.contains() 有什么区别?

    我想知道如果我的数据帧的某些列中存在特定字符串 每列有不同的字符串 据我了解isin https pandas pydata org pandas docs stable generated pandas DataFrame isin ht
  • Ada 与 Netbeans

    我下载了 Netbeans 插件 用于使用 Ada 进行编程 但是 我不知道如何将Eclipse链接到Ada平台库 什么应该链接到 IDE lib 等 bin 我不知道该怎么办 安装后Ada 插件模块 http wiki netbeans
  • 如何将本地Git仓库推送到另一台电脑上?

    我的笔记本电脑上设置了本地 Git 存储库 我想把它推到我的桌面上 我怎样才能做到这一点 如果您有权访问共享目录 则可以 请参阅git clone http git scm com docs git clone and git remote
  • Symfony 2 中的 2 级实体文件夹

    我在 Symfony2 包中有一个两级实体文件夹 CommonBundle Entity EntityFolder1 EntityA php CommonBundle Entity EntityFolder2 CommonBundle En
  • 如何在 .NET 中进行持续测试?

    当我进行 java 开发时 我使用 Infinitest 进行持续测试 并且我真的很怀念在 nET 中开发时的即时反馈 如何在 C 和 NET 中进行持续测试 编辑 我不是在寻找持续集成 例如 CruiseControl TeamCity
  • 如何将引导类添加到模板中的 Django CreateView 表单字段?

    我正在使用 Django CreateView 在模板中我可以单独设置标签和字段 但是 我无法添加我需要的引导类 目前 我有以下表格
  • Powershell NetSecurity 模块在哪里?

    我似乎找不到NetSecurity我的系统上的模块 我正在使用一个Amazon Windows 2008 Server R2 SP1实例 Get Module ListAvailable在我的环境中返回这个 ActiveDirectory
  • 我可以从 Perl 中的进程捕获 STDOUT 写入事件吗?

    我需要 愿意 使用以下方式从 Web 应用程序生成一个缓慢的进程Minion https metacpan org pod Minion queue 该过程 aGLPK https en wikipedia org wiki GNU Lin