[英]Thin doesn't output when fork/exec-ed from Ruby
我正在嘗試通過運行fork
/ exec
在子進程中運行thin start 2>&1
,並且我將STDOUT重新分配給管道,以便我可以通過輸出輸出。
但是,當Thin啟動成功時,我沒有得到任何輸出。 當出現錯誤時,我將以錯誤的順序獲取輸出-首先輸入錯誤文本,然后輸入標准的Thin啟動消息。
我復制了Foreman的代碼,它正確地處理了這個問題。 知道發生了什么事嗎?
碼:
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
發送到$stdout
數據不會立即打印-已被緩沖。 另一方面, $stderr
不被緩沖,當您寫入它時,您會立即看到結果。 讓我們看一個最小的例子。
STDOUT.puts :stdout
STDERR.puts :stderr
將其保存為test.rb
並用ruby test.rb
替換thin start
。 最有可能在stderr
之后打印stdout
。 為了修復它,我們必須使用IO#sync=
方法
STDOUT.sync = true
STDOUT.puts :stdout
STDERR.puts :stderr
現在stdout
將同步打印,就像stderr
,打印字符串的結果順序應該是直觀的。
您的孩子最初缺乏輸出,這可能是由於孩子沒有將數據刷新到STDOUT造成的。 寫入STDERR的第一條數據將導致STDOUT刷新。 嘗試在應用程序或Thin的源代碼中添加STDOUT.sync = true
,看看它是否有幫助。
另請參閱ruby-forum.com上名為實時捕獲輸出的討論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.