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

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

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

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

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

【问题讨论】:

    标签: perl asynchronous ipc


    【解决方案1】:

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

    【讨论】:

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