2016-10-24 60 views
3

我需要在後臺運行一個紅寶石腳本,但我想實時查看它的輸出。Bash - 如何從背景紅寶石腳本中獲得STDOUT

我寫了一個簡單的測試,稱爲loop.rb

#!/usr/bin/env ruby 

(1..4).each do 
    puts "loop!" 
    sleep 1 
end 

誰的前景輸出爲:

[email protected]:~/test$ ./loop.rb 
loop! 
loop! 
loop! 
loop! 

但我不能看到它在後臺:

[email protected]:~/test$ ./loop.rb & 
[2] 3935 
[email protected]:~/test$ 

不過我可以在後臺看到ping的輸出:

[email protected]:~/test$ ping google.com & 
[2] 3734                                                                  
[email protected]:~/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                    

於是,兩個問題:

  1. 爲什麼我能看到的ping輸出,而不是loop.rb輸出?

  2. 如何在Bash背景中獲得loop.rb的輸出?

UPDATE

@TomLord的評論是正確的:有一些奇怪的系統配置。本地我的ruby不是一個普通安裝的ruby解釋器;它是一個在Docker容器中運行ruby的腳本。所以它可能是一個Docker問題。我使用簡單安裝的ruby解釋器在一臺機器上進行了測試,並且工作正常。接下來我將研究Docker緩衝問題。

+0

對我來說工作得很好。 – Stefan

+1

也適合我。也許你有一些奇怪的系統配置? (但即使如此,我不知道爲什麼'ping'將工作,如果這不是?!) –

+0

https://superuser.com/questions/972968/why-does-a-background-process-started-in- bash-print-stdout-to-screen#answer-972980 – bjhaid

回答

2

我發現問題和解決方案。

問題:

  1. 我爲什麼能看到的ping輸出,而不是loop.rb輸出?

因爲我的本地ruby是不是一個真正的Ruby解釋器,但它是它運行ruby碼頭工人,容器內的腳本(更容易比使用rvm恕我直言管理)。所以這是一個碼頭管道緩衝區問題。

解決辦法:

  • 如何獲得的loop.rb在背景中擊輸出?
  • 通過使用unbuffer command

    [email protected]:~/test$ unbuffer ./loop.rb & 
    [3] 7262 
    [email protected]:~/test$ loop! 
    loop! 
    loop! 
    loop! 
    
    2

    嘗試把這個在你的腳本的開頭:

    STDOUT.sync = true 
    

    這應該對Ruby腳本的標準輸出禁用緩衝。如果系統的libc檢測到它沒有在交互式shell中運行,那麼緩衝通常由系統的libc完成。