我需要在后台运行一个ruby脚本,但是我想看到它的实时输出。
我编写了一个名为loop.rb
的简单测试
#!/usr/bin/env ruby
(1..4).each do
puts "loop!"
sleep 1
end
其前景输出为:
sony@sonymint:~/test$ ./loop.rb
loop!
loop!
loop!
loop!
但我看不到它的背景:
sony@sonymint:~/test$ ./loop.rb &
[2] 3935
sony@sonymint:~/test$
不过,我可以在后台看到ping
的输出:
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
因此,有两个问题:
ping
的输出而不是loop.rb
的输出?loop.rb
的输出?更新
@TomLord评论是对的:有一些奇怪的系统配置。在本地,我的ruby
不是一个普通安装的ruby解释器;它是一个在Docker容器中运行ruby
的脚本。所以这可能是码头工人的问题。我在一台带有简单安装的ruby解释器的机器上进行了测试,它运行得很好。接下来我会调查码头缓冲问题。
发布于 2016-10-24 16:35:42
我找到了问题和解决办法。
问题是:
ping
的输出而不是loop.rb
的输出?因为我的本地ruby
不是一个真正的ruby解释器,但它是一个脚本,它在一个码头容器中运行ruby
(比使用rvm
IMHO更容易管理)。所以这是码头管道缓冲的问题。
解决办法:
loop.rb
的输出?通过使用 command
sony@sonymint:~/test$ unbuffer ./loop.rb &
[3] 7262
sony@sonymint:~/test$ loop!
loop!
loop!
loop!
发布于 2016-10-24 16:42:42
试着把它放在脚本的开头:
STDOUT.sync = true
这应该禁用对Ruby脚本的标准输出的缓冲。如果系统的libc检测到没有在交互式shell中运行,则通常由系统的libc进行缓冲。
https://stackoverflow.com/questions/40220978
复制