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
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
.exec bash
danexec 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 manaopen
, mengganti nama semua file itu, lalu login lagi. Masalah yang sama. Saya cukup jelas mengesampingkan perubahan konfigurasi dengan bash itu sendiri.Jawaban:
Sesuatu telah menggangguku tentang output strace. Yaitu bahwa tampaknya ketika pesta dimulai, sepertinya sudah SIGWINCH bertopeng. Tidak bisa memastikan, tidak mengerti setengah dari apa yang dimuntahkannya, tapi itu layak untuk dijelajahi pada saat ini.
Saya lari
strace -o strace_file bash -l
dari shell tcsh, di mana masalahnya tidak ada. bash tidak pernah bertopeng SIGWINCH. Ketika menutupinya, itu hanya karena berusaha memulihkan topeng sebelumnya. Jadi dari mana topeng awal itu berasal?Beberapa waktu lagi di Google dan pikiran yang segar dan saya menemukan posting ini yang menyebutkan bahwa aptitude kadang-kadang dapat menyebabkan sshd dimulai dengan SIGWINCH bertopeng, dan kemudian akan diwarisi oleh semua proses yang muncul langsung ke shell.
Saya mencoba
ps axwwws
(semua, terlepas, keluaran lebar, sinyal). Ini menunjukkan beberapa proses sshd yang telah bertelur SIGWINCH.Server / proses mendengarkan (sshd sendiri) tidak. Juga tidak proses yang menggunakan koneksi hosting yang menggunakan tcsh. Bagian itu membingungkan saya. Saya menduga (sekali lagi, mengetahui sedikit tentang semua ini) bahwa sinyalnya adalah lebar proses-kelompok atau sesuatu, tcsh sedang mengatur ulang pada awal, dan itu juga mempengaruhi ssh.
Jadi, atas kemauan, saya terhubung dengan tcsh (untuk mendapatkan istilah yang bersih tanpa topeng SIGWINCH), restart ssh, mengubah shell saya kembali ke bash ... Dan itu berhasil! Semuanya kembali normal!
Sejauh yang saya tahu aptitude belum dijalankan di kotak ini, dan ssh telah dimulai kembali beberapa kali untuk perubahan konfigurasi. Namun, di suatu tempat di sepanjang garis topeng itu masuk, dan menginfeksi segala sesuatu seperti penyakit buruk.
Untuk mengenali masalah yang sama, jalankan
ps axwwws | grep sshd
dan cari proses sshd dengan kolom panjang kedua (BLOCKED
) memiliki set 0x8000000. Itu SIGWINCH. Sesuatu seperti:Untuk memperbaikinya (mungkin bukan solusi terbaik, bekerja untuk saya):
Dan itu sudah diperbaiki.
Bersulang!
sumber
Coba ini. Melakukan
di shell Anda, lalu ubah ukuran jendela terminal Anda.
sumber