首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用popen3执行脚本时popen3挂起

使用popen3执行脚本时popen3挂起
EN

Stack Overflow用户
提问于 2016-06-24 09:18:24
回答 1查看 297关注 0票数 1

我有下一个代码

代码语言:javascript
复制
 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命令。所以我就像在跑(在第二个脚本中):

代码语言:javascript
复制
execute_bash "./vagrant_up.rb"

这样的结果会导致死锁或其他问题:在某些情况下输出会停止。我可以等很长时间,但它不会继续下去。

当我在控制台中运行流浪时-一切都很好。

在另一个popen3中用popen3运行ruby脚本有问题吗?在popen3中有没有合适的方法来处理死锁(如果是死锁,我不确定)?

EN

回答 1

Stack Overflow用户

发布于 2016-06-25 04:15:00

如果不了解vagrant_up.rb的细节,很难说真正的问题是什么,但请考虑以下几点。

这里我有一个小的bash脚本:

代码语言:javascript
复制
#!/bin/sh
#out.sh
echo "about to sleep"
sleep 3
echo "just woke up"

另一个是:

代码语言:javascript
复制
#!/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吗?如果这不能解决问题,你能发表评论吗?

代码语言:javascript
复制
execute_bash("./vagrant_up.rb 2>&1")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38004274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档