¿Hay alguna forma de evitar la congelación de tmux cuando se envía mucho texto al terminal?

38

En una sesión de tmux dentro de xterm, cuando un programa genera mucha salida (como una cat very_long_filesesión entera congelada por un tiempo. Incluso si presiono Ctrl-C, nada se interrumpe. Presumiblemente porque tmux está congelado y no reenvía Ctrl-C a el programa que genera la salida. ¿Hay alguna manera de evitar esto?

ecerulm
fuente
El problema es que el programa escribió su salida al estándar mucho más rápido de lo que su terminal podría mostrar. Cuando presiona Ctrl-C, el proceso se detiene, pero su terminal continúa imprimiendo la salida almacenada.
chepner
1
La división horizontal de paneles tmux (es decir, Cb%) es mucho más sensible a este problema que los paneles completos o los paneles divididos verticalmente. Además, ejecutar Cb d y volver a conectarlo "descongelará" el programa, aunque solo temporalmente. Realmente no hay una solución a menos que esté dispuesto a profundizar en las configuraciones de tmux.
RussellStewart

Respuestas:

15

La solución correcta es mirar las opciones de c0- * a tmux para intentar limitar la velocidad de salida. La razón por la que este problema existe es debido a que los datos se envían al terminal más rápido de lo que puede mostrarlo, por lo que limitar la velocidad es la única forma.

ThomasAdam
fuente
c0-change-trigger y c0-change-interval parecen resolver el problema. La configuración predeterminada es suficiente para mí.
Ecerulm
setw -g c0-change-interval 100y setw -g c0-change-trigger 250no hace ninguna diferencia para mí Estoy usando tmux-1.8. ¿Hice algo mal?
solotim
@solotim funciona en mi tmux 1.9a, sin embargo, agregué set-window-option -g ...en mi .tmux.conf.
polym
55
Aparentemente, estos se han eliminado en tmux 2.2. :(
Martin C. Martin
20

Todavía tengo este problema en tmux 1.6-2 en Ubuntu 12.10. Una solución alternativa que he encontrado es desconectarse de la sesión (prefijo + d) y luego volver a adjuntar ( tmux attach, buen candidato para un alias de shell rápido). Parece que tmux en realidad responde bajo el capó --- puede confirmar que su proceso realmente se elimina inmediatamente con ctrl-c --- es solo el dibujo el que está bloqueando. Detatch funciona de inmediato, y cuando vuelva a conectar, el dibujo habrá saltado hasta el final.

Jack O'Connor
fuente
Buena solución Parece que, de hecho, todo funciona, incluso cambiando entre divisiones, simplemente no se dibuja.
jmiserez
1
Esto debería ser tmux attach, ¿verdad?
pandubear
Vaya, tienes razón. Fijo.
Jack O'Connor
2
Y si no puede separar, por ejemplo, no está seguro de la macro, simplemente abra una nueva ventana de terminal y tmux attach.
mahemoff
5

Hasta donde yo sé, no hay forma de prevenirlo en las versiones actuales, pero algunos trabajos están en curso. Puede encontrar algunos parches en la lista de correo de tmux http://thread.gmane.org/gmane.comp.terminal-emulators.tmux.user/2689 .

Una buena palabra clave para buscar en la web es "control de flujo".

piec
fuente
2
¿Por qué el parche no está validado en la rama principal? Este problema es la razón más importante por la que sigo usando gnu_screen.
solotim
5

Desafortunadamente, las opciones c0- * para limitar la velocidad se han eliminado a partir de la versión 2.1 de tmux ( registro de cambios ). Hasta donde sé, la única forma de personalizar la limitación de velocidad es actualizar las variables que lo influyen en el código fuente (tmux.h):

" READ_SIZE es el tamaño máximo de datos para retener desde una pty (la marca de agua de evento alta). READ_BACKOFF es la cantidad de datos que se espera que se envíe a un tty antes de que las lecturas de pty se retrocedan. READ_TIME es cuánto tiempo retroceder antes de la siguiente lectura (en microsegundos) si un tty está por encima de READ_BACKOFF " .

Donde encontrará los valores predeterminados: (a partir de tmux v2.2):

#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100
gospes
fuente
1
En tmux v2.3 las variables indicadas no existen.
bergercookie
4

La respuesta https://superuser.com/a/589896/311481 funciona bien. Yo uso los siguientes valores:

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

Otro consejo: si usa ssh dentro de tmux, use mosh en su lugar: http://mosh.mit.edu/ Se comporta de manera más inteligente para mostrar la salida de los programas. Intenta mostrar el último estado de la pantalla colocando intermedios cuando es apropiado. Por lo tanto, tmux nunca se congelará si se genera mucha salida dentro de sus paneles con sesiones de mosh dentro.

A diferencia de SSH, el protocolo basado en UDP de mosh maneja la pérdida de paquetes con gracia y establece la velocidad de cuadros en función de las condiciones de la red. Mosh no llena los buffers de red, por lo que Control-C siempre trabaja para detener un proceso desbocado.

Debido a que el SSP [Protocolo de sincronización de estado que Mosh usa] funciona en la capa de objeto y puede controlar la velocidad de sincronización (en otras palabras, la velocidad de cuadros), no necesita enviar todos los bytes que recibe de la aplicación. Eso significa que Mosh puede regular las tramas para no llenar las memorias intermedias de la red, conservando la capacidad de respuesta de la conexión y asegurándose de que Control-C siempre funcione rápidamente. Los protocolos que deben enviar cada byte no pueden hacer esto.

usuario2683246
fuente
0

Pruebe diferentes emuladores de terminal. En RedHat 6.5, konsole (KDE) no tiene el problema de congelación (tmux 2.3 y master); sin embargo, xterm y gnome-terminal experimentan una mala congelación.

kko
fuente
Sin embargo, tmux 2.2 funciona bien sin problemas de congelación en los tres emuladores de terminal.
kko