Recientemente reinstalamos nuestro servidor debido a una falla del disco, y ahora tenemos un problema con el cambio de tamaño de las terminales. Instalamos Debian 6.0.6.
Síntomas
Cuando cambia el tamaño de un terminal, no parece que las aplicaciones basadas en ncurses (probadas: ytalk, irssi, screen, tmux, algunas de las aplicaciones de ejemplo de ncurses) cambien de tamaño correctamente. La pantalla generalmente termina en blanco. Forzar un nuevo dibujo en la aplicación se volverá a dibujar usando el tamaño de terminal anterior.
Al cambiar el tamaño de una ventana en un indicador bash (4.1.5 (1)), las variables COLUMNS y LINES nunca se actualizan.
Diagnósticos
Intentando atrapar al SIGWINCH en golpe, parece que nunca se está recibiendo. Esto fue probado con:
trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$
Lo que debería haber creado ambos archivos en mi directorio de inicio. Solo se creó /home/user/sigusr1
.
Intentar kill -s SIGWINCH $$
no causa una actualización de las variables $ COLUMNS / $ LINES.
Habilitar checkwinsize
( shopt -s checkwinsize
) hará que bash actualice $ COLUMNS / $ LINES al regresar de cualquier aplicación (como se esperaba). Esto lleva a lo siguiente después de cambiar el tamaño de un terminal con checkwinsize
habilitado:
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
Cambiar mi shell de inicio de sesión a algo como tcsh e intentar cambiar el tamaño del terminal funciona como se esperaba, al igual que bash en otras cajas que probé.
Intenté eliminar mi .bashrc y no hizo nada. Este problema está ocurriendo para otros usuarios con diferentes configuraciones de bash tanto en PuTTY como en algún tipo de terminal de tipo rxvt desde una caja de Linux.
strace
Corrí strah en bash e intenté cambiar el tamaño del terminal, no pasó nada (permaneció bloqueado en una read
llamada inmediatamente después de imprimir el mensaje).
Apreté regresar en una línea vacía, y bash hizo un montón de cosas. El resultado que creo que es relevante es: ( versión completa )
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,
Lo que muestra bash, a mi entender: (podría estar malentendiendo esto horriblemente. Estoy fuera de mi elemento aquí).
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.
Esta misma versión realizada en una caja sin estos problemas (Ubuntu, bash 4.2.24 (1)) resultó en:
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,
Pregunta
¿Qué demonios está pasando y por qué se rompe mi fiesta? :(
Supongo que probablemente solo haya una opción en algún lugar que por defecto sea algo inesperado, pero las horas en Google no han resultado nada.
Cualquier ayuda y / o punteros son muy apreciados. Esto es realmente frustrante.
Gracias.
exec bash
y exec bash -l
exhiben el mismo comportamiento. Supongo que es un pequeño consuelo que no estoy solo en esto. Sin embargo, estoy completamente confundido sobre qué podría causar esto. El colo instaló una instalación mínima desde una imagen de Debian recién descargada. Tendré que intentar instalarlo localmente y ver si hay algún problema y (suponiendo que ninguno, ya que esto parece no ocurrirle a otras personas), comenzar a comparar con el sistema en ejecución.
/etc/bash.bashrc
y todos los archivos /etc/profile
y /etc/profile.d
no se modifican desde una instalación limpia. He descargado la fuente bash ( apt-get source bash
) y estoy jugando con varios argumentos ./configure
para tratar de reducir el problema antes de profundizar en la fuente.
--disable-readline --enable-minimal-config --disable-job-control
Compilé bash menos todos los parches de Debian , ejecuté una secuencia para ver qué archivos tenía open
, renombré todos esos archivos y luego volví a iniciar sesión. Mismo problema. Definitivamente descarté cualquier cambio de configuración con bash.
exec bash
mano (por lo que ya no es un shell de inicio de sesión), ¿todavía se comporta mal? Si no, ¿qué pasaexec bash -l
(entonces es un shell de inicio de sesión)? Si es así, entonces algo pasa con tus scripts de inicio de sesión (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
), pero ni siquiera sé qué decirte que busques, eso puede decirle al shell que no lo hagaSIGWINCH
.