我有下一个代码
def execute_bash(cmd)
puts "Executing: [#{cmd}]"
exit_code = Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
stdin.close
stdout.each { |line| puts line }
stdout.close
stderr.each { |line| puts line }
stderr.close
wait_thr.value.exitstatus
end
return exit_code
end我用这个函数运行的命令是漫游向上的,这会产生很多输出。我有很多食谱,所以我需要逐行实时监控它的输出。
我还有另一个脚本,可以确保前面的脚本运行良好,不会崩溃。因此,我有另一个脚本,它以与前面相同的方式运行bash命令。所以我就像在跑(在第二个脚本中):
execute_bash "./vagrant_up.rb"这样的结果会导致死锁或其他问题:在某些情况下输出会停止。我可以等很长时间,但它不会继续下去。
当我在控制台中运行流浪时-一切都很好。
在另一个popen3中用popen3运行ruby脚本有问题吗?在popen3中有没有合适的方法来处理死锁(如果是死锁,我不确定)?
发布于 2016-06-25 04:15:00
如果不了解vagrant_up.rb的细节,很难说真正的问题是什么,但请考虑以下几点。
这里我有一个小的bash脚本:
#!/bin/sh
#out.sh
echo "about to sleep"
sleep 3
echo "just woke up"另一个是:
#!/bin/sh
#err.sh
echo "about to sleep" 1>&2
sleep 3
echo "just woke up" 1>&2对于您的代码,运行execute_bash("out.sh")产生的结果可能符合您的期望。它说“快睡着了”,然后3秒后又说“刚醒”。但是,运行execute_bash("err.sh")会做一些令人惊讶的事情。它等待3秒,然后打印“即将入睡”和“刚刚醒来”。
所以,根据你的情况,我的猜测如下。您的命令可能正在向stderr生成大量输出,而您只是没有看到而已。实际上,在命令完成之前您不会看到它(因为Open3进程的标准输出流在命令结束之前是不会关闭的)。
可以将stderr重定向到stdout吗?如果这不能解决问题,你能发表评论吗?
execute_bash("./vagrant_up.rb 2>&1")https://stackoverflow.com/questions/38004274
复制相似问题