2012-01-14 65 views
1

我試圖通過運行fork/exec在子進程中運行thin start 2>&1,並且我將STDOUT重新分配給管道,以便可以通過輸入輸出。當從fork中執行fork/exec時,Thin不會輸出Thin

但是,當Thin成功啓動時,我沒有得到任何輸出。出現錯誤時,我會先輸入錯誤順序的錯誤文本,然後是標準Thin啓動消息。

我複製了Foreman的代碼,它正確地處理了這個問題。任何想法發生了什麼?

代碼:發送到$stdout

reader, writer = IO.pipe 
pid = fork do 
    Process.setpgrp 
    trap("INT", "IGNORE") 
    $stdout.reopen writer 
    reader.close 
    exec("thin start 2>&1") 
end 
Process.detach pid 
until reader.eof? 
    puts reader.gets 
end 

回答

3

的數據不會被立即打印 - 它的緩衝。另一方面,$stderr沒有被緩衝,當你寫入它時,你立即看到結果。我們來看一個最簡單的例子。

STDOUT.puts :stdout 
STDERR.puts :stderr 

保存爲test.rb和替換thin startruby test.rb。最有可能的stdout將在stderr後打印。爲了解決這個問題,我們將不得不使用IO#sync=方法

STDOUT.sync = true 
STDOUT.puts :stdout 
STDERR.puts :stderr 

現在stdout會同步打印,就像stderr是,得到的印刷字符串的順序應該是直觀的一個。

您的孩子最初缺乏輸出精簡過程可能是由於孩子沒有將數據刷新到標準輸出。寫入STDERR的第一條數據會導致STDOUT刷新。嘗試在應用程序或Thin的源代碼中添加STDOUT.sync = true,看看它是否有幫助。

另請參閱關於ruby-forum.com的討論,標題爲capture output in real time

+0

謝謝!在嘗試了該線程中討論的解決方案之後,我決定使用PTY來欺騙子進程進入線緩衝模式。 – 2012-01-14 20:45:44