簡體   English   中英

從Ruby中執行fork / exec時,不會輸出Thin

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

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