最近、ディスク障害のためにサーバーを再インストールしましたが、現在、端末のサイズ変更に問題があります。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
ログインシェルを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
)に問題がありますが、シェルにを通知しないようにするために、何を検索するように指示すればよいかわかりませんSIGWINCH
。