Gần đây chúng tôi đã cài đặt lại máy chủ của mình do lỗi đĩa và hiện tại chúng tôi đang gặp sự cố với thay đổi kích thước thiết bị đầu cuối. Chúng tôi đã cài đặt Debian 6.0.6.
Triệu chứng
Khi bạn thay đổi kích thước thiết bị đầu cuối, không có ứng dụng dựa trên ncurses nào (đã thử nghiệm: ytalk, irssi, screen, tmux, một số ứng dụng ví dụ của ncurses) dường như thay đổi kích thước chính xác. Màn hình thường kết thúc trống. Buộc vẽ lại trong ứng dụng sẽ vẽ lại bằng kích thước thiết bị đầu cuối cũ.
Khi thay đổi kích thước cửa sổ tại dấu nhắc bash (4.1.5 (1)), các biến COLUMNS và LINES không bao giờ được cập nhật.
Chẩn đoán
Cố gắng bẫy SIGWINCH trong bash, có vẻ như nó không bao giờ được nhận. Điều này đã được thử nghiệm với:
trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$
Mà nên tạo cả hai tập tin trong thư mục nhà của tôi. Nó chỉ được tạo ra /home/user/sigusr1
.
Cố gắng kill -s SIGWINCH $$
không gây ra cập nhật các biến $ COLUMNS / $ LINES.
Kích hoạt checkwinsize
( shopt -s checkwinsize
) sẽ khiến bash cập nhật $ COLUMNS / $ LINES khi trở về từ bất kỳ ứng dụng nào (như mong đợi). Điều này dẫn đến những điều sau đây sau khi thay đổi kích thước thiết bị đầu cuối checkwinsize
được kích hoạt:
$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107
Thay đổi vỏ đăng nhập của tôi thành một cái gì đó như tcsh và cố gắng thay đổi kích thước thiết bị đầu cuối hoạt động như mong đợi, cũng như bash trên các hộp khác mà tôi đã thử nghiệm.
Tôi đã thử xóa .bashrc của tôi và nó không làm gì cả. Vấn đề này xảy ra đối với một số người dùng khác với các cấu hình bash khác nhau trong cả PuTTY và một số loại thiết bị đầu cuối loại rxvt từ hộp Linux.
bước đi
Tôi đã chạy strace trên bash và thử thay đổi kích thước thiết bị đầu cuối, không có gì xảy ra (nó vẫn bị chặn trong một read
cuộc gọi ngay sau khi in lời nhắc).
Tôi quay trở lại trên một dòng trống, và bash đã làm cả đống thứ. Đầu ra tôi tin là có liên quan là: ( toàn bộ bước )
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,
Điều này cho thấy bash, theo sự hiểu biết của tôi: (Tôi có thể hiểu nhầm khủng khiếp điều này. Tôi thoát khỏi yếu tố của tôi ở đây.)
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.
Chính bước này được thực hiện trên một hộp không có các vấn đề này (Ubuntu, bash 4.2.24 (1)) dẫn đến:
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,
Câu hỏi
Chuyện quái gì đang xảy ra và tại sao bash của tôi bị hỏng? :
Tôi đoán có lẽ chỉ có một tùy chọn ở đâu đó được mặc định là điều bất ngờ, nhưng hàng giờ trên Google đã không có gì.
Bất kỳ trợ giúp và / hoặc con trỏ được đánh giá rất cao. Điều này thực sự bực bội.
Cảm ơn bạn.
exec bash
và exec bash -l
thể hiện cùng một hành vi. Tôi cho rằng đó là một niềm an ủi nhỏ mà tôi không đơn độc trong việc này. Tôi hoàn toàn bối rối về những gì sẽ gây ra điều này, mặc dù. Colo đã cài đặt một bản cài đặt tối thiểu từ hình ảnh Debian mới tải xuống. Tôi sẽ phải thử cài đặt cục bộ và xem có vấn đề gì không và (giả sử là không có, vì điều này dường như không xảy ra với người khác), bắt đầu so sánh với hệ thống đang chạy.
/etc/bash.bashrc
và tất cả các tệp /etc/profile
và /etc/profile.d
tệp không thay đổi từ bản cài đặt sạch. Tôi đã tải xuống nguồn bash ( apt-get source bash
) và đang chơi với nhiều đối số khác nhau ./configure
để thử và thu hẹp vấn đề trước khi tôi tìm hiểu về nguồn.
--disable-readline --enable-minimal-config --disable-job-control
, chạy một bước để xem tập tin nào open
, đổi tên tất cả các tập tin đó, sau đó đăng nhập lại. Cùng một vấn đề. Tôi hoàn toàn loại trừ bất kỳ thay đổi cấu hình nào với chính bash.
exec bash
bằng tay (vì vậy nó không còn là vỏ đăng nhập) liệu nó có còn hoạt động sai không? Nếu không, những gì vềexec bash -l
(vì vậy nó là một vỏ đăng nhập)? Nếu vậy, thì có gì đó phù hợp với tập lệnh đăng nhập của bạn (/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
), nhưng tôi thậm chí không biết phải nói gì với bạn để tìm kiếm có thể nói với trình bao khôngSIGWINCH
.