2016-10-19 21 views
2

私はrubyプログラム(rakeタスク)に別のrakeタスクからの出力を観察させたいと思っています。出力ライターはstderrに出力します。私はそれらの行を読んでみたいです。私はそれを設定するのが難しいです。ruby​​ pipe、IOとstderrリダイレクト

#!/usr/bin/env ruby 
puts 'writing...' 
while true 
    $stdout.puts '~' 
    sleep 1 
end 

およびそれとエコー(stdin_reader.rb)を読み込み、ファイル:

#!/usr/bin/env ruby 
puts 'reading...' 
while input = ARGF.gets 
    puts input 
    input.each_line do |line| 
    begin 
     $stdout.puts "got line #{line}" 
    rescue Errno::EPIPE 
     exit(74) 
    end 
    end 
end 

と私が持ってしようとしている私は常に何かを出力ライター(stdout_writer.rb)を持っている場合彼らは一緒に仕事、何も起こりません:

$ ./stdout_writer.rb 2>&1 | ./stdin_reader.rb 
$ ./stdout_writer.rb | ./stdin_reader.rb 

何を...私はちょうどstdin_reader.rbにエコー場合は、私が手が、私は何を期待:

[email protected]:~/projects/opera_events/sendgrid-example-operaevent$ echo "ok true" | ./stdin_reader.rb 
reading... 
ok true 
got line ok true 
[email protected]:~/projects/opera_events/sendgrid-example-operaevent$ 

stderrがパイプライン化されたスクリプトをセットアップすると、行単位で読むことができますか?追加情報:これはSCRIPT1がメッセージを送信し、スクリプト2は、メッセージが、問題は無限にstdout_writer実行すると、stdin_readerを読む機会を得ることは決してないだろうということのようですSCRIPT1

答えて

0

によって送信されたことを確認するUbuntuの成り上がりサービスscript1.rb | script2.rbになりますこの場合、がパイプとしてのSTDOUTからstdout_writerが終了してから、stdin_readerが読み込みを開始するのを待っています。私はwhile true5.times doに変更してこれをテストしました。あなたがいること、および5秒待って行う場合は、./stdout_writer.rb | ./stdin_reader.rbの結果は

reading... 
writing... 
got line writing... 
~ 
got line ~ 
~ 
got line ~ 
~ 
got line ~ 
~ 
got line ~ 
~ 
got line ~ 

これはあなたのコード自体に問題はなく、より多くのようにSTDOUT | STDIN取り扱い作品の観点から実行をルビー方法に問題はないです。

また、私はこの質問の研究を学んだことを学んだとは思っていません。楽しい運動をありがとう。

1

stdout_writer.rbの出力はRubyによってバッファされているため、読み取りプロセスでは表示されません。十分に長く待っていると、その結果がチャンクに表示されます。

あなたはオフにバッファリング回し、あなたがstdout_writer.rbの開始時に$stdoutsetting sync to trueで期待している結果を得ることができます。

$stdout.sync = true 
関連する問題