tmux使用Ctrl-C缓慢中断进程


25

如果我在tmux中运行带有大量输出的命令,但决定使用Ctrl-C取消该命令,则在停止之前会有10到15秒的延迟。但是,如果我在tmux之外执行相同的操作,它将立即停止。为什么会这样,并且可以修复?

实际上,当我在grep -R大型目录上进行搜索时,就会遇到此问题。一种解决方法是wc先将结果传递给管道,以确保输出不会太长,但这只是我要避免的另一步。


笔记:

  • 这在Gnome终端,uxterm,st和普通虚拟终端(例如ctrl-alt-f2)中具有相同的行为,但是在普通虚拟终端中的延迟较小。
  • 我不是唯一的一个:http : //www.mail-archive.com/tmux-users@lists.sourceforge.net/msg01569.html
  • 如果我的终端窗口较大,则延迟会更长。对于全屏终端,大约需要15秒才能停止grep -R(在没有其他参数的情况下)在杂乱的主目录中。对于80×25字符的终端,它几乎立即停止。

我没有发现任何明显的区别。我已经尝试过grep -R "a" ~/(未写入文件)... yes | nl | cut -f1 | head -9999999 > ~/file然后cat ~/file
Peter.O 2012年

@ Peter.O只需输入“是”,然后按Enter,您的tmux就注定了。
solotim

Answers:


10

tmux现在具有以下选项:

c0-change-interval interval
c0-change-trigger trigger

您可以为这些设置值,这将使^ C和朋友更容易键入。见man tmux

这两个选项为窗格配置速率限制的简单形式。如果tmux 在1毫秒内看到超过修改屏幕的触发器 C0序列(例如,回车,换行或退格键),它将立即停止更新窗格,而是每隔一个间隔毫秒重新绘制一次。这有助于防止快速输出(例如yes(1))淹没终端。默认值为250,间隔为100。零触发将禁用速率限制。


这应该是公认的解决方案,因为它可以工作。
polym 2014年

2
例如setw -g c0-change-trigger 10 setw -g c0-change-interval 250>>〜/ .tmux.conf
DmitrySandalov

2
我在tmux 2.3上尝试过这些,但未被认可。当命令产生大量输出时,它变得完全不可用。
ijt

1
由于TMUX 2.1,这些选项根据不复存在raw.githubusercontent.com/tmux/tmux/2.6/CHANGES 对限速的CO - *选项已被删除。而是使用退避方法。
megar

7

您始终可以kill-pane在会话中发出命令。如果终端文本看起来像垃圾重命名窗口,并且/或者发出该文本,reset则应对其进行修复。


4

由于tmux是在cat进程和终端之间插入自身,因此需要从读取输出cat,将其写入终端,同时从终端(^ C)读取输入,并将其发送到外壳程序以中断命令。我不确定是什么原因导致了延迟,但这与如何tmux缓冲您和运行其中的shell之间的I / O 有关tmux


3

假设您通过低延迟连接使用ssh,是否尝试使用mosh?除其他非常好的功能外,例如输入预测以及在客户端仍然可以断开连接,甚至可以更改IP,它还特别缩短了使用Ctrl-C时的响应时间(通过仅定期更新终端内容而不是发送整个流)。 。

您可以使用tmuxmosh没有任何问题。


奇怪的是,这发生在我在本地工作时。莫什看起来很整洁。
雪球2012年

1

我在tmux 2.3中遇到了这个问题。我尝试如上所述设置c0-change-interval和c0-change-trigger选项,但它们不再可用。这是新尝试的解决方案的git更改:https : //github.com/tmux/tmux/commit/3f4ee98162cd5bb7000f93fec0e631e123b1281d

恢复到tmux 1.8可以解决此问题,而无需设置任何选项。


他们似乎是在尝试解决此问题,而不是使用变通办法,因此,较新的版本应在输出方面甚至更好。github.com/tmux/tmux/issues/849
dragon788 '17
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.