在通过tmux输出缓冲区搜索时,Rails会冻结

mic*_*mwu 24 ruby-on-rails screen tmux

我正在使用tmux在开发模式下运行Rails 3.2.6.当我使用tmux滚动Rails服务器的输出缓冲区(使用rails s运行)时,服务器冻结并且不处理任何请求.当我退出回滚模式时,服务器再次开始正常工作.

在查看输出缓冲区时,如何设置服务器以保持处理请求?

Chr*_*sen 30

如果要在服务器继续处理请求时暂停并检查某些特定的日志消息序列,则最好直接查看日志文件; 你可能会用less -R log/development.log.

虽然TMUX窗格中的"复制模式"(用于查看窗格的历史模式),TMUX不读取从窗格的TTY运行的进程的任何输出.如果进程继续将输出写入tty,则OS的tty缓冲区最终将填充.当程序使用完整缓冲区写入tty时,会导致进程阻塞,以便缓冲区不会溢出; 这是导致您的服务器暂时停止处理请求的原因.

时间表如下所示:

  1. 您进入复制模式以查看一些旧输出.
    tmux停止从tty读取.
  2. 您的Rails服务器在处理正在进行的请求时继续写入tty.
    操作系统将这些写入吸收到一些有限大小的tty缓冲区中.
  3. 最终,OS tty缓冲区填满并导致进一步写入tty以阻止.
    这是Rails服务器"冻结"的地方; 它等待操作系统从(例如)用于显示日志消息的write(2)调用返回.
  4. 您退出复制模式.
    tmux从tty继续读取,耗尽缓冲输出并接受新输出.

  • 除了不使用tmux,还有什么方法可以解决这个问题吗? (3认同)