Disk arızası nedeniyle sunucumuzu yakın zamanda yeniden yükledik ve şimdi terminalleri yeniden boyutlandırmayla ilgili bir sorun yaşıyoruz. Debian 6.0.6'yı kurduk.
belirtiler
Bir terminali yeniden boyutlandırdığınızda, ncurses tabanlı hiçbir uygulama (test edildi: ytalk, irssi, screen, tmux, ncurses örnek uygulamalarından bazıları) doğru şekilde yeniden boyutlandırılmıyor gibi görünüyor. Ekran tipik olarak boş olur. Uygulamada yeniden çizmeye zorlamak, eski terminal boyutunu kullanarak yeniden çizilir.
Pencereyi bash (4.1.5 (1)) isteminde yeniden boyutlandırırken, COLUMNS ve LINES değişkenleri hiçbir zaman güncellenmez.
Teşhis
SIGWINCH'i bash içinde tuzağa düşürmeye çalışırken, hiç alınmamış gibi görünüyor. Bu aşağıdakilerle test edildi:
trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$
Her iki dosyayı da ana dizinimde oluşturmuş olmalıydım. Sadece yarattı /home/user/sigusr1
.
kill -s SIGWINCH $$
Bunu yapmaya çalışmak $ COLUMNS / $ LINES değişkenlerinin güncellenmesine neden olmaz.
checkwinsize
( shopt -s checkwinsize
) Etkinleştirildiğinde bash, herhangi bir uygulamadan (beklendiği gibi) döndüğünde $ COLUMNS / $ LINES'in güncellenmesine neden olur. Bu, checkwinsize
etkinleştirilmiş bir terminali yeniden boyutlandırdıktan sonra aşağıdakilere yol açar :
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
Giriş kabuğumu tcsh gibi bir şeye değiştirmek ve terminali beklediğim gibi yeniden boyutlandırmaya çalışmak, test ettiğim diğer kutulara da basıyor.
Benim .bashrc kaldırmayı denedim ve hiçbir şey yapmadı. Bu sorun, hem PuTTY'de hem de bir çeşit rxvt tipi terminalde bir Linux kutusundan değişen bash konfigürasyonlarına sahip diğer birkaç kullanıcı için ortaya çıkmaktadır.
strace
Bash üzerinde strace koştum ve terminali yeniden boyutlandırmaya çalıştım, hiçbir şey olmadı ( read
istemi yazdırdıktan hemen sonra bir çağrıda engellenmiş kaldı ).
Boş bir çizgide geri döndüm ve bash bir sürü şey yaptı. Alakalı olduğuna inandığım çıktı: ( tam 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,
Bu da benim anlayışım için bash'ı gösteriyor: (Bunu korkunç bir şekilde yanlış anlayabilirdim. Buradaki unsurumdan çok uzaktayım.)
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.
Aynı sorun, bu sorunları olmayan bir kutuda (Ubuntu, bash 4.2.24 (1)) gerçekleştirildi:
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,
Soru
Cehennemde neler oluyor ve neden bashım kırık? :(
Sanırım muhtemelen bir yerlerde beklenmedik bir şeyle sonuçlanan bir seçenek var, ancak Google'daki saatler hiçbir şey göstermedi.
Herhangi bir yardım ve / veya işaretçiler büyük beğeni topluyor. Bu gerçekten sinir bozucu.
Teşekkür ederim.
exec bash
ve exec bash -l
aynı davranışı sergiler. Sanırım bu konuda yalnız olmadığım küçük bir teselli. Yine de buna neyin sebep olacağı konusunda kafam karıştı. Colo, yeni indirilen bir Debian görüntüsünden minimal bir kurulum yükledi. Yerel olarak yüklemeyi denemek ve herhangi bir sorun olup olmadığını görmek zorundayım ve (başkaları için böyle görünmediğinden, hiçbiri varsayarak), çalışan sistemle karşılaştırmaya başlayın.
/etc/bash.bashrc
ve tüm /etc/profile
ve /etc/profile.d
dosyaları yüklemek temiz değiştirilmemiştir. Ben bash kaynağı ( apt-get source bash
) ./configure
indirdim ve ben kaynağa kazmadan önce sorunu daraltmak için denemek ve daraltmak için çeşitli argümanlar ile oynuyorum .
--disable-readline --enable-minimal-config --disable-job-control
, hangi dosyaların olduğunu görmek için bir strace koştum open
, tüm bu dosyaları yeniden adlandırdım ve sonra tekrar giriş yaptım . Aynı sorun. Ben bash kendisi ile herhangi bir yapılandırma değişiklikleri kesinlikle reddetti.
exec bash
elinizdeyse (artık bir giriş kabuğu değil) hala yanlış davranıyor mu? Değilse, ne olacakexec bash -l
(yani bir giriş kabuğu)? Eğer öyleyse, o zaman oturum açma komut dosyalarınızla ilgili bir şey var (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
), ama ne aradığını söyleyeceğimi bile bilmiyorumSIGWINCH
.