派生一个子进程,并捕获任何stdout和stderr?

问题描述 投票:0回答:1

我的下面的代码示例运行一个命令,例如ls <file>,并捕获stdout和stderr(以及进程退出状态)。

但是,例如,如果命令被挂起,那么ruby程序将被“卡住”,等待命令完成((例如,如果运行sleep,则可以看到。)]]

为了避免这种可能性,我认为我需要做的是fork一个子进程,(因此任何“卡住”的子进程都不会使ruby程序“处于等待状态”)。]]

但是,我不确定如何从派生的子进程中捕获stdout和stderr,这甚至可能吗?

(对于reasons

,我也希望能够在ruby std libs中执行此操作,并且不依赖于任何额外的gem / s。另外,这仅用于红宝石,not rails)

edit:为帮助澄清-试图了解是否有一种派生子进程的方法((因此在子进程完成之前就不会阻塞)),

仍然让ruby程序捕获子进程退出时的stdout和stderr。
#!/bin/env ruby

require 'open3'
require 'logger'

logger = Logger.new('./test_open3.log')
files = ['file1','file2','file3']

files.each do |f|
  stdout, stderr, status = Open3.capture3("ls #{f}")
  logger.info(stdout)
  logger.info(stderr)
  logger.info(status)
end

我的下面的代码示例运行一个命令,例如ls ,并捕获stdout和stderr(以及进程退出状态)。但是,例如,如果命令要挂起,那么ruby ...

ruby fork parent-child stdout stderr
1个回答
0
投票

遵循注释中关于使用线程的建议,我发现这给了我我想要的东西:

#!/bin/env ruby

require 'open3'
require 'logger'
require 'thread'

logger = Logger.new('./test_threads_open3.log')
files = ['file1','file2','file3']
threads = []

files.each_with_index do |f, i|
  threads << Thread.new(f, i) do
    puts "Thread #{i} is running"
    stdout, stderr, status = Open3.capture3("ls #{f}")
    logger.info(stdout)
    logger.info(stderr)
    logger.info(status)
   end
 end
threads.each { |t| t.join }
© www.soinside.com 2019 - 2024. All rights reserved.