首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从背景红宝石脚本中获取STDOUT

如何从背景红宝石脚本中获取STDOUT
EN

Stack Overflow用户
提问于 2016-10-24 14:28:01
回答 2查看 221关注 0票数 3

我需要在后台运行一个ruby脚本,但是我想看到它的实时输出。

我编写了一个名为loop.rb的简单测试

代码语言:javascript
运行
复制
#!/usr/bin/env ruby

(1..4).each do
  puts "loop!"
  sleep 1
end

其前景输出为:

代码语言:javascript
运行
复制
sony@sonymint:~/test$ ./loop.rb
loop!
loop!
loop!
loop!

但我看不到它的背景:

代码语言:javascript
运行
复制
sony@sonymint:~/test$ ./loop.rb &
[2] 3935
sony@sonymint:~/test$ 

不过,我可以在后台看到ping的输出:

代码语言:javascript
运行
复制
sony@sonymint:~/test$ ping google.com &
[2] 3734                                                                                                                                                                                                                                                                     
sony@sonymint:~/test$ PING google.com (64.233.190.113) 56(84) bytes of data.                                                                                                                                                                                                 
64 bytes from ce-in-f113.1e100.net (64.233.190.113): icmp_seq=1 ttl=42 time=79.6 ms                                                                                                                                                                                          
64 bytes from ce-in-f113.1e100.net (64.233.190.113): icmp_seq=2 ttl=42 time=79.5 ms                                                                                                                                                                                          
64 bytes from ce-in-f113.1e100.net (64.233.190.113): icmp_seq=3 ttl=42 time=81.7 ms                                                                            

因此,有两个问题:

  1. 为什么我可以看到ping的输出而不是loop.rb的输出?
  2. 如何在Bash中获取背景loop.rb的输出?

更新

@TomLord评论是对的:有一些奇怪的系统配置。在本地,我的ruby不是一个普通安装的ruby解释器;它是一个在Docker容器中运行ruby的脚本。所以这可能是码头工人的问题。我在一台带有简单安装的ruby解释器的机器上进行了测试,它运行得很好。接下来我会调查码头缓冲问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-25 00:35:42

我找到了问题和解决办法。

问题是:

  1. 为什么我可以看到ping的输出而不是loop.rb的输出?

因为我的本地ruby不是一个真正的ruby解释器,但它是一个脚本,它在一个码头容器中运行ruby (比使用rvm IMHO更容易管理)。所以这是码头管道缓冲的问题。

解决办法:

  1. 如何在Bash中获取背景loop.rb的输出?

通过使用 command

代码语言:javascript
运行
复制
sony@sonymint:~/test$ unbuffer ./loop.rb & 
[3] 7262
sony@sonymint:~/test$ loop! 
loop! 
loop! 
loop! 
票数 2
EN

Stack Overflow用户

发布于 2016-10-25 00:42:42

试着把它放在脚本的开头:

代码语言:javascript
运行
复制
STDOUT.sync = true

这应该禁用对Ruby脚本的标准输出的缓冲。如果系统的libc检测到没有在交互式shell中运行,则通常由系统的libc进行缓冲。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40220978

复制
相关文章

相似问题

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