当大量文本输出到终端时,有什么方法可以防止tmux冻结吗?


38

在xterm内的tmux会话中,当程序生成大量输出时(例如cat very_long_file整个会话冻结了一段时间。即使我按Ctrl-C,也不会中断。大概是因为tmux被冻结了,并且没有将Ctrl-C转发给程序生成输出,有什么方法可以防止这种情况。


问题在于程序将其输出写入标准输出的速度远远超过了终端显示它的速度。当您按Ctrl-C时,该过程确实被终止,但是您的终端继续打印缓冲的输出。
chepner

1
水平分割的tmux窗格(即Cb%)对此问题比完整窗格或垂直分割的窗格敏感得多。同样,运行Cb d并重新连接将“解冻”程序,尽管只是暂时的。除非您愿意深入研究tmux配置,否则实际上没有解决方案。
RussellStewart 2014年

Answers:


15

正确的解决方案是查看tmux的c0- *选项,尝试对输出进行速率限制。根本存在此问题的原因是由于数据发送到终端的速度快于其显示的速度,因此限制速率是唯一的方法。


c0-change-trigger和c0-change-interval似乎可以解决问题。默认设置对我来说足够了。
ecerulm

setw -g c0-change-interval 100setw -g c0-change-trigger 250没有任何区别我。我正在使用tmux-1.8。我做错什么了吗?
solotim

@solotim在我的tmux 1.9a上运行,但是我添加set-window-option -g ...到了我的.tmux.conf
polym 2014年

5
显然,这些已在tmux 2.2中删除。:(
马丁C.马丁

20

在Ubuntu 12.10上的tmux 1.6-2中仍然存在此问题。我发现的一种解决方法是从会话(prefix + d)中分离出来,然后重新附加(tmux attach,它是快速shell别名的理想选择)。看起来tmux实际上是在后台进行响应--您可以确认您的进程实际上已被ctrl-c立即终止--只是图被阻塞了。分离将立即生效,并且当您重新附加时,工程图将跳到最后。


好的解决方法。看来实际上一切正常,即使在拆分之间切换,也只是无法绘制。
jmiserez

1
应该是tmux attach吧?
pandubear 2014年

糟糕,您是对的。固定。
Jack O'Connor 2014年

2
而且,如果您无法分离(例如不确定宏),则只需打开一个新的终端窗口,然后单击即可tmux attach
mahemoff 2014年


5

不幸的是,从tmux 2.1版(changelog)起,用于速率限制的c0- *选项已被删除。据我所知,自定义速率限制的唯一方法是在源代码(tmux.h)中更新影响它的变量:

READ_SIZE是要从pty保留的最大数据大小(事件高水位线)。READ_BACKOFF是等待pty读取之前要等待输出到tty的数据量。如果tty高于READ_BACKOFF,则进行下一次读取(以微秒为单位)。

在哪里可以找到默认值:(从tmux v2.2开始):

#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100

1
在tmux v2.3中,指示的变量不存在。
bergercookie

4

答案https://superuser.com/a/589896/311481可以正常工作。我使用以下值:

setw -g c0-change-trigger 10
setw -g c0-change-interval 250

另一个提示:如果在tmux中使用ssh,请改用mosh:http : //mosh.mit.edu/它在显示程序输出方面表现得更聪明。在适当的情况下,它将尝试显示最后的屏幕状态下降中间值。因此,如果tmux的窗格中包含mosh会话,则在其中生成大量输出时,tmux将永远不会冻结。

与SSH不同,mosh的基于UDP的协议可以优雅地处理数据包丢失,并根据网络状况设置帧速率。Mosh不会填满网络缓冲区,因此Control-C始终可以停止失控的进程。

因为SSP(Mosh使用的状态同步协议)在对象层工作并且可以控制同步速率(换句话说,帧速率),所以它不需要发送从应用程序接收到的每个字节。这意味着Mosh可以调节帧,以免填满网络缓冲区,从而保持连接的响应速度,并确保Control-C始终快速运行。必须发送每个字节的协议无法做到这一点。


0

尝试使用其他终端模拟器。在RedHat 6.5上,konsole(KDE)没有冻结问题(tmux 2.3和master);但是,xterm和gnome-terminal都遇到严重冻结。


但是,tmux 2.2可以在所有三个终端仿真器上正常运行而不会出现冻结问题。
kko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.