簡體   English   中英

Bash - 如何從后台ruby腳本獲取STDOUT

[英]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                                                                            

那么,有兩個問題:

  1. 為什么我可以看到ping的輸出而不是loop.rb的輸出?

  2. 如何在Bash的后台獲取loop.rb的輸出?

UPDATE

評論中@TomLord是對的:有一些奇怪的系統配置。 在我的本地ruby不是一個普通安裝的紅寶石翻譯; 它是一個在Docker容器中運行ruby的腳本。 所以它可能是一個Docker問題。 我在一台裝有普通安裝的ruby解釋器的機器上測試過,它工作正常。 接下來我將研究Docker緩沖問題。

我發現了問題和解決方案。

問題:

  1. 為什么我可以看到ping的輸出而不是loop.rb的輸出?

因為我的本地ruby不是真正的ruby解釋器,但它是一個在rvm容器中運行ruby的腳本(比使用rvm IMHO更容易管理)。 所以它是一個docker管道緩沖區問題。

解決方案:

  1. 如何在Bash的后台獲取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM