1つの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
したがって、2つの質問:
の出力ではping
なく、の出力を表示できるのはなぜloop.rb
ですか?
loop.rb
Bashでバックグラウンドでの出力を取得するにはどうすればよいですか?
更新
コメントの@TomLordは正しいです:いくつかの奇妙なシステム構成があります。ローカルでは、私ruby
はプレーンインストールのRubyインタープリターではありません。これはruby
、Dockerコンテナ内で実行されるスクリプトです。したがって、Dockerの問題である可能性があります。プレーンインストールされたRubyインタープリターを備えたマシンでテストしましたが、正常に動作しました。次に、Dockerのバッファリングの問題を調査します。
私は問題と解決策を見つけました。
問題:
ping
なく、の出力を表示できるのはなぜloop.rb
ですか?私のローカルruby
は本物のルビーインタプリタではありませんがruby
、Dockerコンテナ内で実行されるスクリプトです(rvm
IMHOを使用するよりも管理が簡単です)。つまり、Dockerパイプバッファの問題です。
ソリューション:
loop.rb
Bashでバックグラウンドでの出力を取得するにはどうすればよいですか?unbuffer
コマンドを使用して:
sony@sonymint:~/test$ unbuffer ./loop.rb &
[3] 7262
sony@sonymint:~/test$ loop!
loop!
loop!
loop!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加