当前位置: 首页 > 面试题库 >

带有超时的分叉子进程并捕获输出

宫高义
2023-03-14
问题内容

说我有一个下面的函数,如何捕获Process.spawn调用的输出?如果花费的时间超过指定的超时时间,我也应该能够终止该过程。

请注意,该功能还必须是跨平台的(Windows / Linux)。

def execute_with_timeout!(command)
  begin
    pid = Process.spawn(command)     # How do I capture output of this process?
    status = Timeout::timeout(5) {
      Process.wait(pid)
    }
  rescue Timeout::Error
    Process.kill('KILL', pid)
  end
end

谢谢。


问题答案:

您可以使用IO.pipe并告诉Process.spawn使用重定向的输出,而无需外部gem。

当然,仅从Ruby 1.9.2开始(我个人建议1.9.3)

以下是Spinach BDD在内部用于捕获输出和err输出的简单实现:

# stdout, stderr pipes
rout, wout = IO.pipe
rerr, werr = IO.pipe

pid = Process.spawn(command, :out => wout, :err => werr)
_, status = Process.wait2(pid)

# close write ends so we could read them
wout.close
werr.close

@stdout = rout.readlines.join("\n")
@stderr = rerr.readlines.join("\n")

# dispose the read ends of the pipes
rout.close
rerr.close

@last_exit_status = status.exitstatus

原始来源位于features / support /
filesystem.rb中

强烈建议您阅读Ruby自己的Process.spawn文档。

希望这可以帮助。

PS:我将超时实现留给您做功课;-)



 类似资料:
  • 问题内容: 我想在Windows中使用rsync.exe,并在Python中打印标准输出。 我的代码可以运行,但是直到文件传输完成后才能捕获进度!我想实时打印每个文件的进度。 既然我听说使用Python 3.1,现在应该会更好地处理IO。 问题答案: 一些经验法则。 永远不要使用。它不必要地调用额外的shell进程来调用您的程序。 调用进程时,参数作为列表传递。sys.argv在python中是一

  • 问题内容: 我试图用Python编写程序,并被告知运行.exe文件。运行此.exe文件时,它会吐出大量数据,并且我需要在屏幕上打印出一定的行。我很确定我需要使用或类似的东西,但是我是子处理的新手,没有任何线索。有人有简单的方法让我完成此工作吗? 问题答案: 像这样:

  • 问题内容: 我了解到,在Python中执行命令时,应该使用子进程。我想要实现的是通过ffmpeg对文件进行编码,并观察程序输出,直到文件完成。Ffmpeg将进度记录到stderr。 如果我尝试这样的事情: 调用child.communicate()后,程序无法继续执行,并等待命令完成。还有其他方法可以跟踪输出吗? 问题答案: communication()阻塞直到子进程返回,所以循环中的其余各行仅

  • 问题内容: 我试图以秒为单位来衡量通过子流程调用的可执行程序的执行时间。我不希望发出可执行文件(stderr或stdout)的输出。 我已经尝试了timeit和资源库,但是都没有准确地捕获进程的时间,似乎它只捕获了Python worker线程中的时间。 下面的这种尝试将丢失stderr重定向的时序信息b / c。但是,不带stderr重定向,将发出命令’f_cmd’stderr输出。 如何忽略f

  • 问题内容: 是否有任何参数或选项可为Python的subprocess.Popen方法设置超时? 像这样: ? 问题答案: 我会建议采取看看类中的模块。我用它来实现超时。 首先,创建一个回调: 然后打开过程: 然后创建一个计时器,该计时器将调用回调,并将过程传递给它。 在程序后面的某个位置,您可能需要添加以下行: 否则,python程序将继续运行,直到计时器运行完毕。 编辑:我被告知, 在和条件之

  • 问题内容: 我想在子流程上使用超时 不幸的是,尽管这会引起超时错误,但它会在30秒后发生。看来check_output无法中断shell命令。 我该如何在Python方面阻止这种情况?我怀疑subprocess32无法杀死超时的进程。 问题答案: 超时基本上是: 有两个问题: [第二个]可能会等待后代进程,而不仅是直接子进程,请参见Python子进程.check_call与.check_outpu