我的下面的代码示例运行一个命令,例如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 ...
遵循注释中关于使用线程的建议,我发现这给了我我想要的东西:
#!/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 }