Ruby on rails ruby管道、IO和stderr重定向

Ruby on rails ruby管道、IO和stderr重定向,ruby-on-rails,ruby,pipe,Ruby On Rails,Ruby,Pipe,我希望有一个ruby程序(一个rake任务)观察另一个rake任务的输出。输出写入器输出到stderr。我想读那些台词。我设置它有困难。如果我有一个编写器(stdout_writer.rb)不断地打印某些内容: #!/usr/bin/env ruby puts 'writing...' while true $stdout.puts '~' sleep 1 end 以及读取并回显的文件(stdin_reader.rb): 我试着让他们一起工作,什么也没发生: $ ./stdout_wr

我希望有一个ruby程序(一个rake任务)观察另一个rake任务的输出。输出写入器输出到stderr。我想读那些台词。我设置它有困难。如果我有一个编写器(stdout_writer.rb)不断地打印某些内容:

#!/usr/bin/env ruby
puts 'writing...'
while true
  $stdout.puts '~'
  sleep 1
end
以及读取并回显的文件(stdin_reader.rb):

我试着让他们一起工作,什么也没发生:

$ ./stdout_writer.rb 2>&1 | ./stdin_reader.rb
$ ./stdout_writer.rb | ./stdin_reader.rb
没什么。。。虽然如果我只是回显到stdin_reader.rb,我会得到我所期望的:

piousbox@e7440:~/projects/opera_events/sendgrid-example-operaevent$ echo "ok true" | ./stdin_reader.rb
reading...
ok true
got line ok true
piousbox@e7440:~/projects/opera_events/sendgrid-example-operaevent$ 

那么,我该如何设置一个脚本,将stderr导入其中,以便它可以逐行读取它呢?附加信息:这将是一个ubuntu upstart服务
script1.rb | script2.rb
,其中script1发送消息,script2验证消息是否由script1发送

问题似乎是由于
stdout_writer
无限运行,
stdinu读取器
永远不会有机会从
STDOUT写入程序
读取
STDOUT
,因为在这种情况下,管道在
stdinu读取器
开始读取之前等待
STDOUT写入程序
完成。我通过将
while true
更改为
5来测试这一点。如果执行此操作并等待5秒钟,则
/stdout_writer.rb./stdin_reader.rb
的结果为

reading...
writing...
got line writing...
~
got line ~
~
got line ~
~
got line ~
~
got line ~
~
got line ~
这不是代码本身的问题,而是ruby执行在
STDOUT | STDIN
处理方面的问题


另外,我认为我在研究这个问题时学到的东西还不如我在研究这个问题时学到的那么多。谢谢你的有趣练习

来自stdout\u writer.rb的输出被Ruby缓冲,因此读卡器进程看不到它。如果您等待的时间足够长,您应该会看到结果以块的形式出现

通过在stdout_writer.rb的开头打开
$stdout
,可以关闭缓冲并获得预期的结果:

$stdout.sync = true 
$stdout.sync = true