Recentemente, reinstalamos o servidor devido a uma falha no disco e agora estamos tendo um problema ao redimensionar os terminais. Instalamos o Debian 6.0.6.
Sintomas
Quando você redimensiona um terminal, nenhum aplicativo baseado em ncurses (testado: ytalk, irssi, screen, tmux, alguns dos aplicativos de exemplo ncurses) parece redimensionar corretamente. A tela geralmente fica em branco. Forçar um redesenho no aplicativo será redesenhado usando o tamanho do terminal antigo.
Ao redimensionar uma janela em um prompt do bash (4.1.5 (1)), as variáveis COLUMNS e LINES nunca são atualizadas.
Diagnóstico
Tentando interceptar o SIGWINCH no bash, parece que ele nunca está sendo recebido. Isso foi testado com:
trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$
O que deveria ter criado os dois arquivos no meu diretório pessoal. Apenas criou /home/user/sigusr1
.
Tentar kill -s SIGWINCH $$
não causa uma atualização das variáveis $ COLUMNS / $ LINES.
Ativar checkwinsize
( shopt -s checkwinsize
) fará com que o bash atualize $ COLUMNS / $ LINES ao retornar de qualquer aplicativo (conforme o esperado). Isso leva ao seguinte após o redimensionamento de um terminal com checkwinsize
ativado:
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
Alterar meu shell de login para algo como tcsh e tentar redimensionar o terminal funciona como esperado, assim como o bash em outras caixas que testei.
Tentei remover o meu .bashrc e ele não fez nada. Esse problema está ocorrendo para vários outros usuários com configurações de bash variadas no PuTTY e em algum tipo de terminal do tipo rxvt em uma caixa do Linux.
traço
Corri o strace no bash e tentei redimensionar o terminal, nada aconteceu (ele permaneceu bloqueado em uma read
ligação imediatamente após a impressão do prompt).
Apertei return em uma linha vazia e o bash fez um monte de coisas. A saída que acredito ser relevante é: ( rastreamento completo )
1: rt_sigprocmask(SIG_SETMASK, [WINCH], NULL, 8) = 0
2: rt_sigaction(SIGWINCH, {0x80e2c20, [], SA_RESTART}, {0x809c310, [], 0}, 8) = 0
3: rt_sigprocmask(SIG_BLOCK, [INT], [WINCH], 8) = 0
4: write(2, "aa:~$ ", 6) = 6
5: rt_sigprocmask(SIG_SETMASK, [WINCH], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [WINCH], 8) = 0
7: read(0,
O que mostra bash, para meu entendimento: (eu poderia estar terrivelmente mal entendendo isso. Estou fora do meu elemento aqui.)
1: Disabling delivery of the SIGWINCH signal, when previously it was allowed.
2: Registering a handler for the SIGWINCH signal.
3: Masking some other combination of signals. As evidenced by line 5, this does not include SIGWINCH.
4: Printing the prompt.
5: Masking SIGWINCH, where previously nothing was blocked.
6: Masking the "union of null and SIGWINCH" which, to my understanding, would result in SIGWINCH being masked.
7: Waiting on input.
Esse mesmo rastreamento realizado em uma caixa sem esses problemas (Ubuntu, bash 4.2.24 (1)) resultou em:
1: rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
2: rt_sigaction(SIGWINCH, {0x49e320, [], SA_RESTORER|SA_RESTART, 0x7f7ef49f64c0}, {0x457880, [], SA_RESTORER, 0x7f7ef49f64c0}, 8) = 0
3: rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
4: write(2, "aaaaaaa:~$ ", 11) = 11
5: rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
7: read(0,
Questão
O que diabos está acontecendo e por que minha festança está quebrada? :(
Suponho que provavelmente haja apenas uma opção em algum lugar que tenha adotado algo inesperado, mas as horas no Google não resultaram em nada.
Qualquer ajuda e / ou sugestões são muito apreciadas. Isso é realmente frustrante.
Obrigado.
exec bash
e exec bash -l
exibem o mesmo comportamento. Suponho que seja um pequeno consolo que eu não esteja sozinho nisso. Estou completamente confuso sobre o que causaria isso, no entanto. O colo instalou uma instalação mínima a partir de uma imagem recém-baixada do Debian. Vou ter que tentar instalar localmente e ver se há algum problema e (assumindo que não, já que isso parece não acontecer para outras pessoas), comece a comparar com o sistema em execução.
/etc/bash.bashrc
e todos os arquivos /etc/profile
e /etc/profile.d
permanecem inalterados em uma instalação limpa. Eu baixei o bash source ( apt-get source bash
) e estou jogando com vários argumentos ./configure
para tentar diminuir o problema antes de ir para o código-fonte.
--disable-readline --enable-minimal-config --disable-job-control
, corri um rastro para ver quais arquivos ele havia open
renomeado, renomeou todos esses arquivos e depois loguei novamente. O mesmo problema. Definitivamente, eliminei quaisquer alterações na configuração com o próprio bash.
exec bash
manualmente (para que não seja mais um shell de login), ele ainda se comporta mal? Caso contrário, o que dizerexec bash -l
(então é um shell de login)? Nesse caso, algo está acontecendo com seus scripts de login (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
), mas eu nem sei o que dizer para você procurar, o que pode dizer ao shellSIGWINCH
.