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 checkwinsizeativado:
$ 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 readligaçã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 bashe exec bash -lexibem 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.bashrce todos os arquivos /etc/profilee /etc/profile.dpermanecem inalterados em uma instalação limpa. Eu baixei o bash source ( apt-get source bash) e estou jogando com vários argumentos ./configurepara 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 openrenomeado, 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 bashmanualmente (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.