Нещодавно ми перевстановили наш сервер через збій диска, і тепер у нас виникає проблема із зміною терміналів. Ми встановили Debian 6.0.6.
Симптоми
Коли ви змінюєте розмір терміналу, жодна програма на основі ncurses (перевірена: ytalk, irssi, екран, tmux, деякі з прикладних програм ncurses), здається, не змінить розмір правильно. Екран зазвичай закінчується порожнім. Примусовий перемальовування програми буде перемальовано за допомогою старого розміру терміналу.
Змінюючи розмір вікна у запиті bash (4.1.5 (1)), змінні COLUMNS та LINES ніколи не оновлюються.
Діагностика
Спроба захопити SIGWINCH в bash, здається, його ніколи не отримують. Це було протестовано за допомогою:
trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$
Який повинен був створити обидва файли в моєму домашньому каталозі. Він лише створив /home/user/sigusr1
.
Намагання kill -s SIGWINCH $$
не викликає оновлення змінних $ COLUMNS / $ LINES.
Увімкнення checkwinsize
( shopt -s checkwinsize
) призведе до того, що баш оновить $ COLUMNS / $ LINES після повернення з будь-якої програми (як очікувалося). Це призводить до наступного після зміни розміру терміналу з checkwinsize
увімкненим:
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
Зміна моєї вхідної оболонки на щось на кшталт tcsh та спроба змінити розмір терміналу працює, як очікувалося, як і башти в інших тестованих ящиках.
Я спробував видалити свій .bashrc, і це нічого не зробило. Ця проблема виникає для декількох інших користувачів із різними конфігураціями bash як у PuTTY, так і в якомусь терміналі типу rxvt з поля Linux.
стрижка
Я натрапив на баш і спробував змінити розмір терміналу, нічого не вийшло (він залишився заблокованим під час read
виклику одразу після друку підказки).
Я повернувся на порожній рядок, і Баш зробив цілу купу речей. Результат, який я вважаю релевантним, такий: ( повна штрих )
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,
Що свідчить про грубість, наскільки я розумію: (Я можу жахливо нерозуміти це. Я виходжу зі свого стилю тут.)
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.
Це ж штрих, виконаний на коробці без цих проблем (Ubuntu, bash 4.2.24 (1)), призвів до:
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,
Питання
Що в пеклі відбувається, і чому мій бам зламається? :(
Я здогадуюсь, напевно, десь є лише варіант, який дефолт став чимось несподіваним, але години в Google нічого не виявили.
Будь-яка допомога та / або вказівки високо оцінені. Це справді засмучує.
Дякую.
exec bash
і exec bash -l
інше проявляють однакову поведінку. Я гадаю, це невелика розрада, що я не один у цьому. Я все-таки ретельно розгублений щодо того, що могло б викликати це. Колор встановив мінімальну установку із щойно завантаженого зображення Debian. Мені доведеться спробувати встановити локально і побачити, чи є якісь проблеми, і (якщо таких немає, оскільки це, здається, не трапляється для інших людей), почніть порівнювати з працюючою системою.
/etc/bash.bashrc
і всі файли /etc/profile
та /etc/profile.d
файли не змінюються після чистої установки. Я завантажив джерело bash ( apt-get source bash
) і граю з різними аргументами, ./configure
щоб спробувати усунути проблему, перш ніж викопати джерело.
--disable-readline --enable-minimal-config --disable-job-control
, провів строку, щоб побачити, які файли це open
перейменовано, перейменував усі ці файли, а потім знову увійшов у систему. Те саме питання. Я досить точно виключав будь-які зміни конфігурації з самим bash.
exec bash
вручну (значить, це вже не оболонка для входу), вона все ще не поводиться? Якщо ні, то що з цимexec bash -l
(значить, це оболонка для входу)? Якщо так, то щось із вашими скриптами для входу в систему (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
), але я навіть не знаю, що сказати вам, щоб шукати, що може сказати оболонці не робитиSIGWINCH
.