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

时间:2012-12-18 00:08:12

标签: ruby-on-rails screen tmux

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

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

1 个答案:

答案 0 :(得分:28)

如果要在服务器继续处理请求时暂停并检查某些特定日志消息序列,则最好直接查看日志文件;你可以使用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,耗尽缓冲输出并接受新输出。