28

tmux を使用して Rails 3.2.6 を開発モードで実行しています。tmux を使用して Rails サーバー (rails s を使用して実行) の出力バッファーをスクロールすると、サーバーがフリーズし、要求を処理しません。スクロールバック モードをエスケープすると、サーバーは再び正常に動作し始めます。

出力バッファを調べている間、サーバーがリクエストを処理し続けるように設定するにはどうすればよいですか?

4

1 に答える 1

35

サーバーがリクエストの処理を続行している間、ログメッセージの特定のシーケンスを一時停止して調べたい場合は、代わりにログファイルを直接表示するのがおそらく最善です。を使用する場合がありますless -R log/development.log

tmuxペインが「コピーモード」(ペインの履歴を表示するために使用されるモード)にある間、tmuxペインのttyで実行されているプロセスからの出力を読み取りません。プロセスが引き続きttyに出力を書き込む場合、OSのttyバッファは最終的にいっぱいになります。プログラムがフルバッファでttyに書き込むと、バッファがオーバーフローしないようにプロセスがブロックされます。これにより、サーバーはリクエストの処理を一時的に停止します。

タイムラインは次のようになります。

  1. 古い出力を表示するには、コピーモードに入ります。
    tmuxはttyからの読み取りを停止します。
  2. Railsサーバーは、進行中のリクエストを処理するため、引き続きttyに書き込みます。
    OSは、これらの書き込みを制限されたサイズのttyバッファに吸収します。
  3. 最終的に、OS ttyバッファがいっぱいになり、ttyへの書き込みがさらにブロックされます。
    これは、Railsサーバーが「フリーズ」する場所です。OSが(たとえば)ログメッセージを表示するために行ったwrite(2)呼び出しから戻るのを待ってスタックします。
  4. コピーモードを終了します。
    tmuxは、ttyからの読み取りを再開し、バッファリングされた出力を排出して、新しい出力を受け入れます。
于 2013-01-28T19:11:25.543 に答える