Есть ли способ предотвратить зависание tmux при выводе большого количества текста на терминал?

38

В сеансе tmux внутри xterm, когда программы генерируют много выходных данных (как, например, cat very_long_fileвесь сеанс в замороженном состоянии на некоторое время. Даже если я нажимаю Ctrl-C, ничто не прерывается. Предположительно, потому что tmux заморожен, и он не передает Ctrl-C в программа, генерирующая вывод. Есть ли способ предотвратить это.

ecerulm
источник
Проблема в том, что программа записала свои выходные данные в стандартный формат намного быстрее, чем ваш терминал мог их отобразить. Когда вы нажимаете Ctrl-C, процесс действительно останавливается, но ваш терминал продолжает печатать буферизованный вывод.
chepner
1
Горизонтальное разделение панелей tmux (т.е. Cb%) гораздо более чувствительно к этой проблеме, чем полные панели или вертикально разделенные панели. Кроме того, запуск Cb d и повторное подключение приведет к «размораживанию» программы, хотя и только временно. На самом деле решения не существует, если вы не хотите копаться в конфигурациях tmux.
RussellStewart

Ответы:

15

Правильное решение - взглянуть на опции c0- * в tmux, чтобы попытаться ограничить скорость вывода. Причина, по которой эта проблема вообще существует, заключается в том, что данные отправляются на терминал быстрее, чем он может их отобразить, поэтому ограничение скорости - единственный способ.

ThomasAdam
источник
c0-change-trigger и c0-change-interval решают проблему. Настройки по умолчанию мне достаточно.
Ecerulm
setw -g c0-change-interval 100и setw -g c0-change-trigger 250не имеет никакого значения для меня. Я использую tmux-1.8. Я сделал что-то неправильно?
Солотим
@solotim работает на моем tmux 1.9a, однако я добавил set-window-option -g ...в свой .tmux.conf.
полим
5
По-видимому, они были удалены в tmux 2.2. :(
Мартин С. Мартин
20

У меня все еще есть эта проблема в tmux 1.6-2 на Ubuntu 12.10. Один из обходных путей, который я нашел, состоит в том, чтобы отсоединиться от сеанса (префикс + d), а затем повторно присоединить ( tmux attachхороший кандидат для быстрого псевдонима оболочки). Похоже, что tmux на самом деле быстро реагирует - вы можете подтвердить, что ваш процесс на самом деле немедленно завершен с помощью ctrl-c - блокируется только чертеж. Detatch работает немедленно, и при повторном присоединении чертеж будет пропущен до конца.

Джек О'Коннор
источник
Хороший обходной путь. Кажется, что на самом деле все работает, даже переключаясь между сплитами, просто не прорисовывается.
jmiserez
1
Это должно быть tmux attach, верно?
pandubear
Ой, ты прав. Исправлена.
Джек О'Коннор
2
И если вы не можете отсоединиться, например, не уверены в макросе, просто откройте новое окно терминала и tmux attach.
mahemoff
5

Насколько я знаю, нет способа предотвратить это в текущих выпусках, но некоторая работа продолжается. Вы можете найти некоторые исправления в списке рассылки tmux http://thread.gmane.org/gmane.comp.terminal-emulators.tmux.user/2689 .

Хорошее ключевое слово для поиска в Интернете - «управление потоком».

Piec
источник
2
почему патч не проверен в основной ветке? эта проблема - самая важная причина, по которой я все еще использую gnu_screen.
Солотим
5

К сожалению, опции ограничения скорости c0- * были удалены с tmux версии 2.1 ( журнал изменений ). Насколько я знаю, единственный способ настроить ограничение скорости - это обновить переменные, влияющие на него, в исходном коде (tmux.h):

« READ_SIZE - это максимальный размер данных, сохраняемых из pty (верхний водный знак события). READ_BACKOFF - это объем данных, ожидающих вывода в tty, прежде чем pty-чтения будут возвращены. READ_TIME - это сколько времени нужно откатить до следующее чтение (в микросекундах), если tty выше READ_BACKOFF. "

Где вы найдете значения по умолчанию: (по состоянию на tmux v2.2):

#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100
gospes
источник
1
В tmux v2.3 указанные переменные не существуют.
bergercookie
4

Ответ https://superuser.com/a/589896/311481 работает отлично. Я использую следующие значения:

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

Еще один совет: если вы используете ssh в tmux, используйте вместо этого mosh: http://mosh.mit.edu/ Он ведет себя умнее при отображении вывода программ. Он пытается отобразить последнее состояние экрана, опускающее промежуточные звенья, когда это уместно. Таким образом, tmux никогда не замерзнет, ​​если на его панели генерируется много выходных данных с сессиями mosh внутри.

В отличие от SSH, протокол mosh на основе UDP корректно обрабатывает потери пакетов и устанавливает частоту кадров в зависимости от состояния сети. Mosh не заполняет сетевые буферы, поэтому Control-C всегда работает, чтобы остановить процесс разгона.

Поскольку SSP [State Synchronization Protocol, который использует mosh] работает на объектном уровне и может управлять скоростью синхронизации (другими словами, частотой кадров), ему не нужно отправлять каждый байт, который он получает от приложения. Это означает, что Mosh может регулировать кадры, чтобы не заполнять сетевые буферы, сохраняя скорость отклика соединения и следя за тем, чтобы Control-C всегда работал быстро. Протоколы, которые должны отправлять каждый байт, не могут этого сделать.

user2683246
источник
0

Попробуйте другой эмулятор терминала. В RedHat 6.5 у konsole (KDE) нет проблемы с зависанием (tmux 2.3 и master); однако, xterm и gnome-Terminal испытывают сильное замораживание.

ККО
источник
Тем не менее, tmux 2.2 работает без проблем с зависанием на всех трех эмуляторах терминала.
Кко