Kami baru-baru ini menginstal ulang server kami karena kegagalan disk, dan sekarang kami mengalami masalah dengan pengubahan ukuran terminal. Kami menginstal Debian 6.0.6.
Gejala
Ketika Anda mengubah ukuran terminal, tidak ada aplikasi berbasis ncurses (diuji: ytalk, irssi, layar, tmux, beberapa aplikasi contoh ncurses) tampaknya mengubah ukuran dengan benar. Layar biasanya kosong. Memaksa redraw dalam aplikasi akan redraw menggunakan ukuran terminal lama.
Saat mengubah ukuran jendela pada prompt bash (4.1.5 (1)), variabel COLUMNS dan LINES tidak pernah diperbarui.
Diagnostik
Mencoba untuk menjebak SIGWINCH di bash, tampaknya itu tidak pernah diterima. Ini diuji dengan:
trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$
Yang seharusnya membuat kedua file di direktori home saya. Itu hanya dibuat /home/user/sigusr1
.
Mencoba untuk kill -s SIGWINCH $$
tidak menyebabkan pembaruan variabel $ COLUMNS / $ LINES.
Mengaktifkan checkwinsize
( shopt -s checkwinsize
) akan menyebabkan bash memperbarui $ COLUMNS / $ LINES setelah kembali dari aplikasi apa pun (seperti yang diharapkan). Ini mengarah ke hal-hal berikut setelah mengubah ukuran terminal dengan checkwinsize
diaktifkan:
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
Mengubah shell login saya menjadi sesuatu seperti tcsh dan mencoba mengubah ukuran terminal berfungsi seperti yang diharapkan, seperti halnya bash pada kotak lain yang saya uji.
Saya mencoba menghapus .bashrc saya dan tidak berhasil. Masalah ini terjadi untuk beberapa pengguna lain dengan konfigurasi bash yang bervariasi di Putty dan semacam terminal tipe rxvt dari kotak Linux.
strace
Saya berlari strace pada bash dan mencoba mengubah ukuran terminal, tidak ada yang datang (tetap diblokir pada read
panggilan segera setelah mencetak prompt).
Aku memukul balik pada baris kosong, dan bash melakukan banyak hal. Output yang saya yakini relevan adalah: ( strace penuh )
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,
Yang menunjukkan bash, menurut pemahaman saya: (Saya bisa salah paham tentang ini. Saya jauh dari elemen saya di sini.)
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.
Strace yang sama ini dilakukan pada kotak tanpa masalah ini (Ubuntu, bash 4.2.24 (1)) menghasilkan:
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,
Pertanyaan
Apa yang sedang terjadi dan mengapa bash saya rusak? :(
Saya kira mungkin hanya ada opsi di suatu tempat yang default ke sesuatu yang tidak terduga, tetapi jam di Google tidak menghasilkan apa-apa.
Bantuan dan / atau petunjuk sangat dihargai. Ini benar-benar membuat frustrasi.
Terima kasih.
exec bash
dan exec bash -l
menunjukkan perilaku yang sama. Saya kira ini adalah penghiburan kecil bahwa saya tidak sendirian dalam hal ini. Saya benar-benar bingung tentang apa yang menyebabkan ini. Colo memasang instalasi minimal dari gambar Debian yang baru diunduh. Saya harus mencoba menginstal secara lokal dan melihat apakah ada masalah dan (dengan asumsi tidak ada, karena ini tampaknya tidak terjadi untuk orang lain), mulai membandingkan dengan sistem yang sedang berjalan.
/etc/bash.bashrc
dan semua /etc/profile
dan /etc/profile.d
file tidak berubah dari instalasi yang bersih. Saya telah mengunduh sumber bash ( apt-get source bash
) dan saya bermain dengan berbagai argumen ./configure
untuk mencoba dan mempersempit masalahnya sebelum saya menggali sumbernya.
--disable-readline --enable-minimal-config --disable-job-control
, menjalankan strace untuk melihat file yang mana open
, mengganti nama semua file itu, lalu login lagi. Masalah yang sama. Saya cukup jelas mengesampingkan perubahan konfigurasi dengan bash itu sendiri.
exec bash
menggunakan tangan (jadi ini bukan lagi shell login) apakah masih bermasalah? Jika tidak, bagaimana denganexec bash -l
(jadi itu shell login)? Jika demikian, maka ada sesuatu yang terjadi dengan skrip login Anda (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
), tapi saya bahkan tidak tahu harus mengatakan apa kepada Anda untuk mencari yang dapat memberitahu shell untuk tidak melakukannyaSIGWINCH
.