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
@ Peter.O Просто введите «да» и нажмите Enter, ваш tmux обречен.
Солотим

Ответы:

10

У tmux теперь есть следующие опции:

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

Вы можете установить значения для них, что облегчит ввод ^ C и друзей. Смотрите man tmux:

Эти два параметра настраивают простую форму ограничения скорости для панели. Если tmux видит больше, чем триггерные последовательности C0, которые изменяют экран (например, возврат каретки, переводы строки или возвраты) в течение одной миллисекунды, он немедленно прекращает обновление панели и вместо этого перерисовывает ее целиком каждые миллисекунды интервала . Это помогает предотвратить быстрый вывод (например, yes (1)), перегружающий терминал. По умолчанию используется триггер 250 и интервал 100. Нулевой триггер отключает ограничение скорости.

ThomasAdam
источник
Это должно быть принятое решение, потому что оно работает.
полим
2
Например, setw -g c0-change-trigger 10 setw -g c0-change-interval 250~ / .tmux.conf
Дмитрий Сандалов,
2
Я попробовал это на tmux 2.3, и они не были распознаны. Это становится совершенно непригодным, когда команды выдают много выходных данных.
ijt
1
Начиная с Tmux 2.1, эти опции больше не существуют в соответствии с raw.githubusercontent.com/tmux/tmux/2.6/CHANGES . Опции c0- * для ограничения скорости были удалены. Вместо этого используется подход отсрочки.
Мегар
7

Вы всегда можете подать kill-paneкоманду изнутри сессии. Если текст терминала выглядит как мусор, переименование окна и / или выдача resetдолжны исправить это.

lukaszkorecki
источник
4

Поскольку tmuxон вставляется между catпроцессом и вашим терминалом, ему необходимо прочитать выходные данные cat, записать их в терминал и одновременно прочитать ваши входные данные из терминала (^ C) и отправить их в оболочку, чтобы прервать команда. Я не уверен точно, что вызывает задержку, но это что-то о том, как tmuxбуферизует ввод-вывод между вами и оболочкой, которая работает tmux.

chepner
источник
3

Предполагая, что вы используете ssh через соединение с низкой задержкой, вы пробовали использовать mosh ? Среди других очень приятных вещей, таких как предсказание ввода, а также выжившие разъединения и даже изменение IP на стороне клиента, это также специально улучшает время реакции при использовании Ctrl-C (путем только периодического обновления содержимого терминала вместо отправки всего потока) ,

Вы можете использовать tmuxвнутри moshбез каких-либо проблем.

Жюльен Остер
источник
Как ни странно, это происходит, когда я работаю на месте. Мош выглядит довольно аккуратно, хотя.
Снежок
1

У меня была эта проблема с Tmux 2.3. Я попытался установить параметры c0-change-interval и c0-change-trigger, как описано выше, но они больше не доступны. Вот изменение git с новым попытанным решением: https://github.com/tmux/tmux/commit/3f4ee98162cd5bb7000f93fec0e631e123b1281d

Возврат к tmux 1.8 исправил проблему без необходимости устанавливать какие-либо параметры.

IJT
источник
Похоже, что они пытаются исправить это, а не использовать обходной путь, поэтому более новые версии должны быть еще лучше в выводе. github.com/tmux/tmux/issues/849
dragon788