[英]Bash - How to get STDOUT from a background ruby script
我需要在后台運行一個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
的輸出?
如何在Bash的后台獲取loop.rb
的輸出?
UPDATE
評論中@TomLord是對的:有一些奇怪的系統配置。 在我的本地ruby
不是一個普通安裝的紅寶石翻譯; 它是一個在Docker容器中運行ruby
的腳本。 所以它可能是一個Docker問題。 我在一台裝有普通安裝的ruby解釋器的機器上測試過,它工作正常。 接下來我將研究Docker緩沖問題。
我發現了問題和解決方案。
問題:
ping
的輸出而不是loop.rb
的輸出? 因為我的本地ruby
不是真正的ruby解釋器,但它是一個在rvm
容器中運行ruby
的腳本(比使用rvm
IMHO更容易管理)。 所以它是一個docker管道緩沖區問題。
解決方案:
loop.rb
的輸出? 通過使用unbuffer
命令 :
sony@sonymint:~/test$ unbuffer ./loop.rb &
[3] 7262
sony@sonymint:~/test$ loop!
loop!
loop!
loop!
嘗試將其放在腳本的開頭:
STDOUT.sync = true
這應該禁用Ruby腳本的標准輸出緩沖。 緩沖通常由系統的libc完成,如果它檢測到它沒有在交互式shell中運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.