Nous avons récemment réinstallé notre serveur en raison d'une panne de disque, et nous avons maintenant un problème avec le redimensionnement des terminaux. Nous avons installé Debian 6.0.6.
Symptômes
Lorsque vous redimensionnez un terminal, aucune application basée sur ncurses (testée: ytalk, irssi, screen, tmux, certaines des applications d'exemple ncurses) ne semble redimensionner correctement. L'écran finit généralement vide. Forcer un nouveau dessin dans l'application sera redessiné en utilisant l'ancienne taille du terminal.
Lors du redimensionnement d'une fenêtre à l'invite bash (4.1.5 (1)), les variables COLUMNS et LINES ne sont jamais mises à jour.
Diagnostique
Tentant de piéger le SIGWINCH dans bash, il semble qu'il ne soit jamais reçu. Cela a été testé avec:
trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$
Qui aurait dû créer les deux fichiers dans mon répertoire personnel. Il a seulement créé /home/user/sigusr1
.
Tenter de kill -s SIGWINCH $$
ne provoque pas de mise à jour des variables $ COLUMNS / $ LINES.
L'activation de checkwinsize
( shopt -s checkwinsize
) obligera bash à mettre à jour $ COLUMNS / $ LINES au retour de n'importe quelle application (comme prévu). Cela conduit aux éléments suivants après avoir redimensionné un terminal avec checkwinsize
activé:
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
Changer mon shell de connexion en quelque chose comme tcsh et essayer de redimensionner le terminal fonctionne comme prévu, tout comme bash sur d'autres boîtes que j'ai testées.
J'ai essayé de supprimer mon .bashrc et cela n'a rien fait. Ce problème se produit pour plusieurs autres utilisateurs avec différentes configurations bash dans PuTTY et une sorte de terminal de type rxvt à partir d'une boîte Linux.
strace
J'ai exécuté strace sur bash et j'ai essayé de redimensionner le terminal, rien ne l'a traversé (il est resté bloqué lors d'un read
appel immédiatement après l'impression de l'invite).
J'ai frappé retour sur une ligne vide, et bash a fait tout un tas de trucs. Le résultat que je pense être pertinent est: ( full strace )
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,
Ce qui montre bash, à ma compréhension: (Je pourrais être horriblement mal compris. Je suis loin de mon élément ici.)
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.
Cette même séquence effectuée sur une boîte sans ces problèmes (Ubuntu, bash 4.2.24 (1)) a entraîné:
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,
Question
Que diable se passe-t-il et pourquoi ma bash est-elle cassée? :(
Je suppose qu'il y a probablement juste une option quelque part qui s'est transformée en quelque chose d'inattendu, mais les heures sur Google n'ont rien révélé.
Toute aide et / ou pointeurs sont grandement appréciés. C'est vraiment frustrant.
Je vous remercie.
exec bash
et exec bash -l
présentent le même comportement. Je suppose que c'est une petite consolation que je ne sois pas le seul. Je suis profondément confus quant à ce qui pourrait provoquer cela, cependant. Le colo a installé une installation minimale à partir d'une image Debian fraîchement téléchargée. Je vais devoir essayer d'installer localement et voir s'il y a des problèmes et (en supposant qu'aucun, car cela ne semble pas se produire pour d'autres personnes), commencer à comparer avec le système en cours d'exécution.
/etc/bash.bashrc
et tous les fichiers /etc/profile
et /etc/profile.d
sont inchangés à partir d'une nouvelle installation. J'ai téléchargé la source bash ( apt-get source bash
) et je joue avec divers arguments ./configure
pour essayer de réduire le problème avant de creuser dans la source.
--disable-readline --enable-minimal-config --disable-job-control
, exécuté une strace pour voir quels fichiers il avait open
, renommé tous ces fichiers, puis connecté à nouveau. Même problème. J'ai assez certainement exclu tout changement de configuration avec bash lui-même.
exec bash
à la main (donc ce n'est plus un shell de connexion) se comporte-t-il toujours mal? Sinon, qu'en est-ilexec bash -l
(c'est donc un shell de connexion)? Si c'est le cas, alors quelque chose ne va pas avec vos scripts de connexion (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
), mais je ne sais même pas quoi vous dire de rechercher qui peut dire au shell de ne pas le faireSIGWINCH
.