Existe alguma maneira de impedir o congelamento do tmux quando muito texto é enviado para o terminal?


38

Em uma sessão tmux no xterm, quando um programa gera muita saída (como cat very_long_filea sessão inteira congelada por um tempo. Mesmo se eu pressionar Ctrl-C, nada é interrompido. Provavelmente porque o tmux está congelado e não está encaminhando o Ctrl-C para o programa que gera a saída.Existe alguma maneira de evitar isso.


O problema é que o programa gravou sua saída no padrão muito mais rapidamente do que o seu terminal poderia exibi-lo. Quando você pressiona Ctrl-C, o processo é realmente interrompido, mas seu terminal continua a imprimir a saída em buffer.
Chepner # 30/12

1
A divisão horizontal de painéis tmux (ou seja,% Cb) é muito mais sensível a esse problema do que painéis completos ou painéis divididos verticalmente. Além disso, a execução de Cb d e a recolocação irão "descongelar" o programa, embora apenas temporariamente. Não existe realmente uma solução, a menos que você esteja disposto a se aprofundar nas configurações do tmux.
precisa saber é o seguinte

Respostas:


15

A solução correta é examinar as opções c0- * no tmux para tentar limitar a taxa de saída. A razão pela qual esse problema existe é o fato de os dados serem enviados para o terminal mais rapidamente do que podem ser exibidos, portanto, a limitação da taxa é a única maneira.


c0-change-trigger e c0-change-interval parecem resolver o problema. As configurações padrão são suficientes para mim.
Ecerulm

setw -g c0-change-interval 100e setw -g c0-change-trigger 250não faz nenhuma diferença para mim. Estou usando o tmux-1.8. Fiz algo de errado?
Solotim 20/08/2013

@solotim Funciona no meu tmux 1.9a, no entanto eu adicionei set-window-option -g ...no meu .tmux.conf.
polym 25/07

5
Aparentemente, eles foram removidos no tmux 2.2. :(
Martin C. Martin

20

Eu ainda tenho esse problema no tmux 1.6-2 no Ubuntu 12.10. Uma solução alternativa que encontrei é desanexar da sessão (prefixo + d) e reconectar ( tmux attachbom candidato a um alias de shell rápido). Parece que o tmux é realmente responsivo sob o capô - você pode confirmar que seu processo é realmente eliminado imediatamente com ctrl-c - é apenas o desenho que está bloqueando. A remoção funciona imediatamente e, quando você reconecta, o desenho pulou para o final.


Boa solução alternativa. Parece que, de fato, tudo funciona, mesmo alternando entre divisões, simplesmente não é desenhado.
jmiserez

1
Isso deveria ser tmux attach, certo?
Pandubear # 6/14

Opa, você está certo. Fixo.
Jack O'Connor

2
E se você não pode desconectar, por exemplo, não tem certeza da macro, basta abrir uma nova janela do terminal e tmux attach.
mahemoff

5

Tanto quanto sei, não há como evitá-lo nos lançamentos atuais, mas algum trabalho está em andamento. Você pode encontrar alguns patches na lista de discussão do tmux http://thread.gmane.org/gmane.comp.terminal-emulators.tmux.user/2689 .

Uma boa palavra-chave para pesquisar na web é "controle de fluxo".


2
por que o patch não é validado na ramificação principal? esse problema é o motivo mais importante de eu ainda usar o gnu_screen.
Solotim 15/08/12

5

Infelizmente, as opções c0- * para limitação de taxa foram removidas a partir da versão 2.1 do tmux ( changelog ). Até onde eu sei, a única maneira de personalizar o limite de taxa é atualizar as variáveis ​​que o influenciam no código-fonte (tmux.h):

" READ_SIZE é o tamanho máximo de dados a serem retidos de um pty (a marca d'água alta do evento). READ_BACKOFF é a quantidade de dados que aguardam a saída de um tty antes que as leituras do pty sejam recuadas. READ_TIME é o tempo de recuo antes do próxima leitura (em microssegundos) se um tty estiver acima de READ_BACKOFF. "

Onde você encontrará os padrões: (a partir do tmux v2.2):

#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100

1
No tmux v2.3, as variáveis ​​indicadas não existem.
bergercookie

4

A resposta https://superuser.com/a/589896/311481 funciona bem. Eu uso os seguintes valores:

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

Outra dica: se você usar o ssh no tmux, use o mosh: http://mosh.mit.edu/ Ele se comporta de maneira mais inteligente quanto à exibição dos resultados dos programas. Ele tenta exibir o último estado da tela eliminando intermediários quando apropriado. Portanto, o tmux nunca congelará se muita saída for gerada dentro de seus painéis com sessões mosh dentro.

Ao contrário do SSH, o protocolo baseado em UDP da mosh lida com a perda de pacotes normalmente e define a taxa de quadros com base nas condições da rede. O Mosh não preenche os buffers da rede; portanto, o Control-C sempre trabalha para interromper um processo descontrolado.

Como o SSP [Protocolo de Sincronização de Estado que o mosh usa] funciona na camada de objetos e pode controlar a taxa de sincronização (em outras palavras, a taxa de quadros), ele não precisa enviar todos os bytes recebidos do aplicativo. Isso significa que o Mosh pode regular os quadros para não preencher os buffers da rede, mantendo a capacidade de resposta da conexão e garantindo que o Control-C sempre funcione rapidamente. Os protocolos que devem enviar todos os bytes não podem fazer isso.


0

Tente emulador de terminal diferente. No RedHat 6.5, o konsole (KDE) não possui o problema de congelamento (tmux 2.3 e master); no entanto, o xterm e o gnome-terminal experimentam um congelamento ruim.


No entanto, o tmux 2.2 funciona bem sem problemas de congelamento nos três emuladores de terminal.
Kev1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.