2012-12-18 49 views
19

我在使用tmux的開發模式下運行Rails 3.2.6。當我使用tmux瀏覽Rails服務器的輸出緩衝區(使用rails運行)時,服務器會凍結並且不處理任何請求。當我轉回回滾模式時,服務器再次開始正常工作。當通過tmux輸出緩衝區搜索時,Rails凍結

如何在我查看輸出緩衝區時設置我的服務器以繼續處理請求?

回答

21

如果您希望在服務器繼續處理請求時暫停並檢查某些特定的日誌消息順序,最好直接查看日誌文件;你可以使用less -R log/development.log

雖然TMUX窗格是「複印模式」(用於查看一個窗格的歷史的模式),TMUX不讀取從窗格的TTY運行的進程的任何輸出。如果進程繼續將輸出寫入tty,那麼操作系統的tty緩衝區將最終填充。當一個程序用一個完整的緩衝區寫入一個tty時,它會導致該進程被阻塞,從而緩衝區不會溢出;這是導致您的服務器暫時停止處理請求的原因。

的時間表是這樣的:

  1. 你進入副本模式,查看一些舊的輸出。
    tmux停止讀取tty。
  2. 您的Rails服務器在處理正在進行的請求時會繼續寫入tty。
    OS將這些寫入吸收到一些有限大小的tty緩衝區中。
  3. 最終,OS tty緩衝區填滿並導致進一步寫入tty以阻止。
    這是Rails服務器「凍結」的地方;它被卡在等待操作系統從(例如)寫入(2)返回的調用中顯示日誌消息。
  4. 退出複印模式。
    tmux從tty恢復讀取,排空緩衝的輸出並接受新的輸出。
+1

除了不使用tmux,有沒有辦法解決這個問題? – justingordon

+0

@justingordon:如果在窗格處於「複製模式」時,在* tmux *窗格中運行的程序足夠寫入,則它將最終阻塞。如果您需要查看一個健談的,長時間運行的過程的輸出,最好將輸出發送到日誌文件,並使用'less'之類的字眼來查看,而不是使用* tmux *的「複製模式」。 –

+0

在iTerm2中運行txmux是解決此問題的一種方法。 – justingordon