SSH 経由で vim が固まる?VPN を疑う前に stty を確認する
SSH 越しに固まったエディタは、多くの場合ネットワークではなく端末の状態の問題です。正しい疑似端末で stty を読み、その端末だけを修復してください。
このようなセッションはエディタの起動中は接続を保ち、その後 SSH プロセスが明らかに生きているのに画面の更新が止まります。入力しても何も出ず、Ctrl-C も何もしていないように見え、明白な結論は VPN が何かを落としたというものです。ほとんどの場合トンネルは正常で、遠隔の疑似端末が誰も意図しない状態になっていて、エコー、カノニカル入力、フロー制御はネットワークではなく端末の中に住んでいるからです。その三つのどれが動いたのかを突き止めるのは、二つのコマンドの仕事です。
固まりはトンネルではなく端末の中に住んでいる
疑似端末はバイト以上のものを運びます。行規律のフラグを保持し、入力がエコーされるか、読み取りが改行を待つか、特定の文字がシグナルを発生させるか、制御文字で出力を止められるかを決めます。対話型エディタはその端末を操作中ずっと生モードに切り替え、終了時に以前の設定を復元するはずです。復元が行われないと、接続が一度も切れていなくても、戻ってくるシェルは離れたシェルではなくなります。
何かを結論づける前に端末を比較してください。同じエディタを動かす二つ目のセッションは、クライアントと経路が作業できることを証明しますが、フラグが壊れた端末については何も語りません。
固まった端末で設定を読む
まずデバイスを特定し、次にその状態の二つの形式を読みます。読める形式は何が設定されているかを示し、機械形式は後で書き戻せる形式です。
tty
stty -a
stty -g
三つのフラグ群がこれらの報告のほとんどを説明します。エコーの設定はキー入力がそもそも表示されるかを決めるので、エコーが切れた端末はシェルがすべての文字を受け取っていても死んで見えます。カノニカルモードはプログラムが入力を一行ずつ見るかを決めるので、カノニカルモードのままにされた端末では、生モードのアプリが Enter までキーを無視しているように見えます。フロー制御の設定は端末が XON と XOFF の文字に従うかを決め、この群が三つの中で最も説得力のある偽の固まりを生みます。
何かを変える前に、特にセッションが誰かの頼りにしている独自のキー割り当てを持つ場合は、出力を記録してください。機械形式が最も安全な記録ですが、実装依存であり、生成したのと同じ種類のシステムで復元すべきという但し書きが付きます。
その一つの端末を直すのであって、入力中のセッションではない
標準の修復はマニュアルページに載っている健全なプロファイルを復元し、一つの端末にだけ影響します。エディタがその端末に未保存の作業をまだ持っているなら、作業が保存されるまでそのままにしてください。
別のシェルから、固まったデバイスを明示的に指定して、作業中の端末が触られないようにします。
stty -F /dev/pts/7 -a
stty -F /dev/pts/7 sane
表示が壊れた空白の画面は、壊れた行規律とは別の問題であり、reset プログラムは端末初期化シーケンスを送って対処します。検査できる設定を変えるのでまず状態の修復を試し、reset シーケンスは画面を書き直すだけでどう壊れたかは何も説明しないため後回しにしてください。
説得力のある固まりの裏にある Ctrl-S の罠
ソフトウェアフロー制御が有効で通常の文字が割り当てられているとき、Ctrl-S は端末に出力の送信を止めるよう伝え、Ctrl-Q は再開するよう伝えます。セッションはその間ずっと生きており、Ctrl-Q 一回で修復が済むことも多く、どのログにも何も出ないので、この固まりはこれほど多くのエスカレーションを生き延びるのです。
仮定せずに実際の設定を調べてください。開始と停止の文字は再割り当てや無効化ができ、フロー制御が切れた端末はどちらにも反応しません。
状態が戻る場合、または SSH 自体が止まる場合
繰り返す不調は、起動ファイル、ラッパースクリプト、誤ったウィンドウをリセットするマルチプレクサ、生モードを保持したまま死ぬアプリケーションなど、フラグを元に戻さずに変える何かを指します。一律のリセットは原因を隠し意図した設定を上書きすることがあるので、無条件のリセットではなく状態を報告する条件付きチェックを追加してください。
通常の SSH 通信も止まる場合、または修復で何も変わらない場合、端末は容疑者ではなくなります。
ssh -vvv [email protected]
ping -M do -s 1400 -c 3 host.example.com
大きな転送のときだけ現れる停止は経路の MTU 問題を示し、単独のキー入力も飲み込む停止はパケットサイズではなく経路やサーバーを示します。二つ目のセッションで動くエディタは最初の端末が健全だった証拠にならないので、端末の証拠はネットワークの証拠と分けてください。