Чи є спосіб запобігти заморожуванню tmux, коли в термінал виводиться багато тексту?


38

Під час сеансу tmux всередині xterm, коли програми генерують багато вихідних даних (як-от cat very_long_fileцілий сеанс у замороженому на деякий час. Навіть якщо я натискаю Ctrl-C, нічого не переривається. Імовірно, тому, що tmux заморожений і він не пересилає Ctrl-C на програма, що генерує вихід. Чи є спосіб запобігти цьому.


Проблема полягає в тому, що програма записала свій вихід на стандартне набагато швидше, ніж ваш термінал міг би відобразити його. Коли ви натискаєте Ctrl-C, процес дійсно знищується, але ваш термінал продовжує друкувати буферний вихід.
чепнер

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

Відповіді:


15

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


c0-тригер зміни та c0-інтервал зміни, здається, вирішують проблему. Мені вистачає стандартних налаштувань.
ecerulm

setw -g c0-change-interval 100і setw -g c0-change-trigger 250для мене це не має ніякого значення. Я використовую tmux-1.8. Я щось зробив не так?
solotim

@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 --- це просто креслення, яке блокує. Стяжка працює негайно, і коли ви повторно додаєте, малюнок пропустить до кінця.


Гарне вирішення. Здається, що насправді все працює, навіть перемикаючись між розколами, це просто не витягується.
jmiserez

1
Це має бути tmux attach, правда?
пандубеар

На жаль, ви праві. Виправлено.
Джек О'Коннор

2
І якщо ви не можете від'єднатися, наприклад, не впевнені в макросі, просто відкрийте нове вікно терміналу і tmux attach.
mahemoff

5

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

Хорошим ключовим словом для пошуку в Інтернеті є "контроль потоку".


2
чому патч не підтверджений в основній галузі? ця проблема є найважливішою причиною я все ще використовую gnu_screen.
solotim

5

На жаль, C0 - опція * для швидкості лімітування було віддалена від tmux версії 2.1 ( журнал змін ). Наскільки мені відомо, єдиний спосіб налаштувати обмеження швидкості - це оновлення змінних, що впливають на нього у вихідному коді (tmux.h):

" READ_SIZE - це максимальний розмір даних, який потрібно зберегти з pty (подія з високим водяним знаком). READ_BACKOFF - це кількість даних, які очікують на виведення до tty, перш ніж читання pty буде відключено. наступне зчитування (у мікросекундах), якщо 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

Ще одна порада: якщо ви використовуєте ssh в межах tmux, використовуйте mosh замість цього: http://mosh.mit.edu/ Він поводиться розумніше щодо відображення результатів програм. Він намагається відобразити проміжні проміжки стану останнього екрану, коли це доречно. Таким чином, tmux ніколи не зависне, якщо в його панелях буде створено багато результатів із сесіями mosh всередині.

На відміну від SSH, протокол, що базується на Mosh, підтримує втрату пакету витончено та встановлює частоту кадрів на основі мережевих умов. Mosh не заповнює мережеві буфери, тому Control-C завжди працює, щоб зупинити відвернутий процес.

Оскільки SSP [протокол синхронізації стану, який використовує mosh] працює на об'єктному рівні і може керувати швидкістю синхронізації (іншими словами, частотою кадрів), йому не потрібно надсилати кожен байт, який він отримує від програми. Це означає, що Mosh може регулювати кадри, щоб не заповнювати мережеві буфери, зберігаючи чуйність з'єднання і переконуючись, що Control-C завжди працює швидко. Протоколи, які повинен надсилати кожен байт, не можуть цього зробити.


0

Спробуйте інший емулятор терміналу. У RedHat 6.5 консоль (KDE) не має проблеми з заморожуванням (tmux 2.3 та master); однак xterm та gnome-terminal обидва заморожують.


tmux 2.2, однак, працює чудово без заморозки на всіх трьох термінальних емуляторах.
кко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.