हमने हाल ही में डिस्क विफलता के कारण हमारे सर्वर को फिर से इंस्टॉल किया है, और अब हम टर्मिनलों को आकार देने के साथ एक समस्या है। हमने डेबियन 6.0.6 स्थापित किया।
लक्षण
जब आप एक टर्मिनल का आकार बदलते हैं, तो कोई ncurses- आधारित एप्लिकेशन (परीक्षण किया गया: ytalk, irssi, स्क्रीन, tmux, कुछ ncurses उदाहरण अनुप्रयोग) सही ढंग से आकार बदलने लगते हैं। स्क्रीन आमतौर पर खाली होती है। आवेदन में एक redraw मजबूर पुराने टर्मिनल आकार का उपयोग कर redraw जाएगा।
जब एक bash (4.1.5 (1)) प्रॉम्प्ट पर विंडो का आकार बदलते हैं, तो COLUMNS और LINES वैरिएबल कभी अपडेट नहीं होते हैं।
निदान
SIGWINCH को फँसाने के प्रयास में, ऐसा लगता है कि यह कभी प्राप्त नहीं हो रहा है। इसके साथ परीक्षण किया गया था:
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 निकालने की कोशिश की और इसने कुछ नहीं किया। यह समस्या कई अन्य उपयोगकर्ताओं के लिए PuTTY में अलग-अलग बैश कॉन्फ़िगरेशन और लिनक्स बॉक्स से कुछ प्रकार के rxvt- प्रकार टर्मिनल के साथ हो रही है।
strace
मैं बैश पर स्ट्रेच भाग गया और टर्मिनल को आकार देने की कोशिश की, कुछ भी नहीं आया (यह 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.
इन मुद्दों के बिना एक बॉक्स पर इसी स्ट्रेस का प्रदर्शन किया गया (उबंटू, बैश 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
एक ही व्यवहार दर्शाते हैं। मुझे लगता है कि यह एक छोटी सांत्वना है कि मैं इसमें अकेला नहीं हूं। मैं अच्छी तरह से उलझन में हूँ कि यह क्या कारण होगा, हालांकि। कोलो ने ताजा डाउनलोड की गई डेबियन छवि से एक न्यूनतम स्थापित किया। मुझे स्थानीय रूप से स्थापित करने का प्रयास करना होगा और देखना होगा कि क्या कोई समस्या है और (कोई नहीं मान रहा है, क्योंकि यह अन्य लोगों के लिए नहीं होता है), चल प्रणाली की तुलना करना शुरू करें।
/etc/bash.bashrc
और सभी /etc/profile
और /etc/profile.d
फ़ाइलें एक क्लीन इंस्टाल से अपरिवर्तित हैं। मैंने bash स्रोत डाउनलोड किया है ( apt-get source bash
) और ./configure
स्रोत में खुदाई करने से पहले समस्या को कम करने और कम करने के लिए विभिन्न तर्कों के साथ खेल रहा हूं।
--disable-readline --enable-minimal-config --disable-job-control
, यह देखने के लिए एक स्ट्रींग चलाई कि यह किस फाइल open
की डी है, उन सभी फाइलों का नाम बदला, फिर दोबारा लॉग इन किया। वही मुद्दा। मैं निश्चित रूप से निश्चित रूप से बैश के साथ किसी भी कॉन्फ़िगरेशन परिवर्तन से इंकार करता हूं।
exec bash
हाथ से हैं (तो यह अब लॉगिन शेल नहीं है) क्या यह अभी भी दुर्व्यवहार करता है? यदि नहीं, तो किस बारे मेंexec bash -l
(इसलिए यह एक लॉगिन शेल है)? यदि ऐसा है, तो आपके लॉगिन स्क्रिप्ट (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
) के साथ कुछ है , लेकिन मुझे यह भी नहीं पता है कि आपको क्या बताना है जो आपको ढूंढना है, शेल को नहीं बता सकता हैSIGWINCH
।