เราเพิ่งติดตั้งเซิร์ฟเวอร์ของเราอีกครั้งเนื่องจากความล้มเหลวของดิสก์และตอนนี้เรากำลังมีปัญหากับการปรับขนาดเทอร์มินัล เราติดตั้ง Debian 6.0.6
อาการ
เมื่อคุณปรับขนาดเทอร์มินัลไม่มีแอพที่ใช้ ncurses (ทดสอบแล้ว: ytalk, irssi, หน้าจอ, tmux, ตัวอย่างแอพพลิเคชั่น ncurses) ดูเหมือนจะปรับขนาดอย่างถูกต้อง โดยทั่วไปหน้าจอจะว่างเปล่า การบังคับให้วาดใหม่ในแอปพลิเคชันจะวาดใหม่โดยใช้ขนาดเทอร์มินัลเก่า
เมื่อปรับขนาดหน้าต่างที่พร้อมท์ 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
) จะทำให้ bash อัปเดต $ COLUMNS / $ LINES เมื่อกลับมาจากแอปพลิเคชันใด ๆ (ตามที่คาดไว้) สิ่งนี้นำไปสู่สิ่งต่อไปนี้หลังจากปรับขนาดเทอร์มินัลด้วยการcheckwinsize
เปิดใช้งาน:
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
การเปลี่ยนเชลล์ล็อกอินของฉันเป็นอะไรเช่น tcsh และพยายามปรับขนาดเทอร์มินัลทำงานตามที่คาดไว้เช่นเดียวกับทุบตีในกล่องอื่น ๆ ที่ฉันทดสอบ
ฉันพยายามลบ. bashrc และไม่ได้ทำอะไรเลย ปัญหานี้เกิดขึ้นสำหรับผู้ใช้อื่น ๆ ที่มีการกำหนดค่า bash ที่แตกต่างกันทั้ง PuTTY และเทอร์มินัลชนิด rxvt บางประเภทจากกล่อง Linux
strace
ฉันวิ่ง strace บนทุบตีและพยายามปรับขนาดเทอร์มินัลไม่มีอะไรผ่าน (มันยังคงถูกบล็อกในการread
โทรทันทีหลังจากพิมพ์พรอมต์)
ฉันตีกลับในบรรทัดที่ว่างเปล่าและทุบตีได้ทุกสิ่ง ผลลัพธ์ที่ฉันเชื่อว่าเกี่ยวข้อง: ( 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,
ซึ่งแสดงถึงการทุบตีเพื่อความเข้าใจของฉัน: (ฉันอาจจะเข้าใจผิดอย่างน่ากลัวนี้ฉันออกจากองค์ประกอบของฉันที่นี่)
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 แบบเดียวกันนี้ดำเนินการบนกล่องโดยไม่มีปัญหาเหล่านี้ (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
แสดงพฤติกรรมเดียวกัน ฉันคิดว่ามันเป็นความปลอบใจเล็กน้อยที่ฉันไม่ได้อยู่คนเดียวในเรื่องนี้ ฉันสับสนอย่างถี่ถ้วนถึงสิ่งที่จะทำให้เกิดสิ่งนี้ colo ติดตั้งการติดตั้งขั้นต่ำจากอิมเมจ Debian ที่ดาวน์โหลดใหม่ ฉันจะต้องลองติดตั้งในเครื่องและดูว่ามีปัญหาหรือไม่และ (สมมติว่าไม่มีเนื่องจากสิ่งนี้ดูเหมือนจะไม่เกิดขึ้นกับคนอื่น) เริ่มเปรียบเทียบกับระบบที่กำลังทำงานอยู่
/etc/bash.bashrc
และไฟล์ทั้งหมด/etc/profile
และ/etc/profile.d
ไม่เปลี่ยนแปลงจากการติดตั้งใหม่ทั้งหมด ฉันดาวน์โหลด bash source ( apt-get source bash
) และกำลังเล่นกับอาร์กิวเมนต์ต่าง ๆ./configure
เพื่อลองและ จำกัด ปัญหาให้แคบลงก่อนที่จะขุดลงในซอร์ส
--disable-readline --enable-minimal-config --disable-job-control
วิ่ง strace เพื่อดูไฟล์ที่มันopen
เปลี่ยนชื่อไฟล์ทั้งหมดจากนั้นเข้าสู่ระบบอีกครั้ง ปัญหาเดียวกัน ฉันค่อนข้างจะปกครองการเปลี่ยนแปลงการกำหนดค่าอย่างแน่นอนด้วยการทุบตีตัวเอง
exec bash
ใช้มือ (ดังนั้นจึงไม่ใช่เชลล์การเข้าสู่ระบบอีกต่อไป) มันยังทำงานผิดปกติหรือไม่ ถ้าไม่เป็นexec bash -l
เช่นนั้นจะเป็นเชลล์ล็อกอินหรือไม่ ถ้าเป็นเช่นนั้นแล้วสิ่งที่ขึ้นอยู่กับสคริปต์การเข้าสู่ระบบของคุณ (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
)SIGWINCH
แต่ผมไม่ได้รู้ว่าสิ่งที่จะบอกคุณจะต้องมองหาที่สามารถบอกเปลือกจะไม่