带有 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::ForkManager
和Forks::Super
等模块提供的(我是Forks::Super的作者)。
【讨论】:
谢谢,我去看看。 我忘记了部分要求是我们不会派生一个运行命令的子进程(本质上是运行两个进程来执行一项任务)。它应该只是产生命令的父级 - 两者之间没有“子级”。这有意义吗? 因为您想要捕获 STDOUT 和 STDERR,如果您不想要额外的任务,您将不得不使用 IO::Select 循环。这意味着您需要进行自己的流程管理,但这很简单。 您可以fork
+exec
(而不是fork
+system
)在单个子进程中运行命令。 Forks::Super
可以为您做到这一点,甚至可以模拟 Windows 上的行为。
@mob - exec 没有返回任何东西,对吧?从技术上讲,我可以将命令输出重定向到命令本身的文件,但我不会得到脚本的退出状态。以上是关于带有 IPC::Run 的 Perl 命令执行器的主要内容,如果未能解决你的问题,请参考以下文章
Perl IPC::Run 附加输出并解析标准错误,同时将其保存在一批文件中