由于磁盘故障,我们最近重新安装了服务器,现在终端大小调整出现了问题。我们安装了Debian 6.0.6。
病征
调整终端大小时,似乎没有正确调整基于ncurses的应用程序(经测试:ytalk,irssi,screen,tmux,某些ncurses示例应用程序)。屏幕通常最终变为空白。在应用程序中强制重绘将使用旧的终端大小进行重绘。
当在bash(4.1.5(1))提示符下调整窗口大小时,COLUMNS和LINES变量永远不会更新。
诊断程序
试图将SIGWINCH捕获在bash中,似乎从未收到过。经过测试:
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
将我的登录Shell更改为tcsh之类的内容并尝试调整终端的大小即可,正如我测试的其他盒子上的bash一样,可以按预期工作。
我试图删除我的.bashrc,但没有执行任何操作。对于在PuTTY和Linux盒中的某种rxvt型终端中具有不同bash配置的其他几个用户,会出现此问题。
痕迹
我在bash上运行strace并尝试调整终端的大小,没有任何反应(read
在打印提示后,呼叫仍然被阻止)。
我在空行上按回车键,bash做了很多事情。我认为相关的输出是:(full 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,
据我所知,它显示出bash :(我可能会对此产生严重的误解。我不在这里。)
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.
在没有这些问题的盒子上执行相同的跟踪(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,
题
到底是怎么回事,为什么我的bash坏了?:(
我猜可能某个地方的某个选项默认不会出现意外情况,但是Google的工作时间却什么都没有。
任何帮助和/或指针,不胜感激。这真令人沮丧。
谢谢。
exec bash
并exec bash -l
表现出相同的行为。我想这并不算孤单,这只是一个小小的安慰。不过,我对造成这种情况的原因非常困惑。colo从新下载的Debian映像安装了最小安装。我将不得不尝试在本地安装并查看是否存在任何问题,并且(假设没有问题,因为这似乎对其他人没有发生),请开始与正在运行的系统进行比较。
/etc/bash.bashrc
所有/etc/profile
和/etc/profile.d
文件均未更改。我已经下载了bash的源代码(apt-get source bash
),并且在研究各种./configure
源代码之前尝试缩小问题的范围。
--disable-readline --enable-minimal-config --disable-job-control
,然后运行strace来查看要删除的文件,并重open
命名了所有这些文件,然后再次登录。同样的问题。我已经相当确定地排除了bash本身的任何配置更改。
exec bash
是手工操作的(因此它不再是登录外壳),它仍然会表现异常吗?如果不是,那该怎么办exec bash -l
(所以这是一个登录外壳)?如果是这样,则登录脚本(/etc/profile
/etc/profile.d/
~/.bash_profile
~/.profile
)出了点问题,但是我什至不知道该告诉您什么,这可以告诉Shell不这样做SIGWINCH
。