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

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

如果我在 tmux 中运行一个输出很多的命令,但决定用 Ctrl-C 取消它,它会在停止前有 10-15 秒的延迟。但是,如果我在 tmux 之外做同样的事情,它会立即停止。为什么会这样?可以修复吗?

实际上,当我grep -R在大型目录上执行搜索且搜索范围不够严格时,就会出现此问题。一种解决方法是将结果通过管道传输到wcfirst 以确保输出不会太长,但这只是我想避免的另一个步骤。


笔记:

  • 这在 Gnome Terminal、uxterm、st 和普通虚拟终端(例如 ctrl-alt-f2)中具有相同的行为,但在普通虚拟终端中的延迟较少。
  • 我不是唯一一个:http://www.mail-archive.com/[电子邮件保护]/msg01569.html
  • 如果我的终端窗口较大,延迟会更长。对于全屏终端,grep -R在杂乱的主目录中停止(没有其他参数)大约需要 15 秒。对于 80×25 字符的终端,它几乎立即停止。

答案1

tmux 现在有以下选项:

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

您可以为这些设置值,这将使 ^C 和相关项更容易输入。请参阅man tmux

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

答案2

您始终可以kill-pane在会话中发出命令。如果终端文本看起来像垃圾,则重命名窗口和/或发出命令reset应该可以解决问题。

答案3

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

答案4

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

恢复到 tmux 1.8 解决了这个问题,无需设置任何选项。

相关内容