带有 IPC::Run 的 Perl 命令执行器

Posted

技术标签:

【中文标题】带有 IPC::Run 的 Perl 命令执行器【英文标题】:Perl command executor with IPC::Run 【发布时间】:2014-03-31 19:31:46 【问题描述】:

我需要编写一个“命令执行器”来执行以下操作:

    从数据库中收集命令。 产生 $LIMIT 数量的命令(将异步运行)。 当 1 个命令完成时,可以启动另一个命令(只要未达到命令 $LIMIT)。 命令不应由父进程的子进程生成(我不想运行子进程 + 命令进程)。 将结果记录到数据库和日志文件(退出状态、标准输出和标准错误)。 用 Perl(或 php)编写。

我已经测试了IPC::Run。我只能让它以块的形式运行命令(一次 X)。我必须等待那些 X 完成,然后运行另一个块。不过,我可能做错了什么——它的参考页面很难遵循。这能满足我的需要吗?

我还发现了以下看起来很有希望的内容 (How to write parallel programs in Perl?)。这会做我需要的吗?

【问题讨论】:

【参考方案1】:

条件2和3被称为限流,这个特性是由Parallel::ForkManagerForks::Super等模块提供的(我是Forks::Super的作者)。

【讨论】:

谢谢,我去看看。 我忘记了部分要求是我们不会派生一个运行命令的子进程(本质上是运行两个进程来执行一项任务)。它应该只是产生命令的父级 - 两者之间没有“子级”。这有意义吗? 因为您想要捕获 STDOUT 和 STDERR,如果您不想要额外的任务,您将不得不使用 IO::Select 循环。这意味着您需要进行自己的流程管理,但这很简单。 您可以fork+exec(而不是fork+system)在单个子进程中运行命令。 Forks::Super 可以为您做到这一点,甚至可以模拟 Windows 上的行为。 @mob - exec 没有返回任何东西,对吧?从技术上讲,我可以将命令输出重定向到命令本身的文件,但我不会得到脚本的退出状态。

以上是关于带有 IPC::Run 的 Perl 命令执行器的主要内容,如果未能解决你的问题,请参考以下文章

Perl IPC::Run 附加输出并解析标准错误,同时将其保存在一批文件中

对 perl IPC::Run 感到困惑

从 git 捕获 STDOUT/STDERR

如何判断 IPC::Run 作业何时完成

Perl 模棱两可的命令行选项,以及带有 -i 的 eval 的安全隐患?

如何使用 IPC::Run 回答 rsync 密码提示?