ubuntu20.04でtmux3.3aをビルドしてハマったりやらかした話
TL;DR
- tmux3.0aでは使えない機能が使いたかった
- ログイン時にtmuxのセッションを確認するようにしていた
- tmux3.0a時のサーバーが起動していた
- tmux3.3aでは、古いバージョンのサーバーが起動していると、「古いサーバーのやつが動いてるぜ」って言って何もしなくなるコマンドがいる
- tmuxが動かなくなってログイン後の処理が死亡
-
現在進行形で動いているソフトを不用意にアップデートするのはやめましょう
- 特に他のユーザーも使っているような場合には絶対
- 当たり前だけど忘れがちなので
- 新バージョンのサーバー常駐ソフトを使うときには、きちんと旧バージョンを落とすようにしましょう。
- 落とせない場合は作業をやめときましょう(なるべく)。
- 更新作業を行う際には、安全(変更が影響しない)なシェルを常に確保しておきましょう
ubuntu20.04にtmux3.3aが入ってない
し、apt
とかで入れることはできない。
ppaにもまともそうなのがないので、仕方なく手元でビルドすることに
はまりポイント1: ビルドに必要なパッケージが入らない
を参考にビルドしようとしたら、"libevent-2.1-7"がないと言われた。
sudo apt install libevent-2.1-7
を実行したところ、「もっと新しいやつが入っとる!入れんとくわ」と拒否られてしまった。
正解
この回答が正解。要は、devパッケージを入れる必要があったということ(よく考えたら、そりゃそうなんだが)。
sudo apt install libevent-dev
はまりポイント2: ビルドに必要なツール(yacc)が入ってない
./configure
を実行したところ、「yacc
ないよ〜」と怒られた。
yacc
が含まれているbison
を素直に入れて、モッカイやり直した
sudo apt install bison
./configure
やらかしポイント
「よっしゃ、make
も通ったし、sudo make install
してやるか〜」
と意気揚々と実行し、/usr/local/bin/tmux
にtmux3.3aのバイナリが配置された。
その後、TL;DRにも書いたように、古いサーバーを削除しない状態でログアウトしてしまったのだ。
ログインし直したときに悲劇は起きた。
server version is too old for client
と表示され、先に進まなくなってしまったのだ。
起動直後には、↓のコードが走るようになっている。(実際にはもっと長いですが、ハマってるのはこのコードでした)
sessions=$(tmux list-sessions)
どうやら、古いバージョンが起動している状態でlist-sessions
の実行結果をキャプチャすると、ハングしてしまうらしい。
この状態になると、強制終了(C-c
)もサスペンド(C-z
)も効かなくなってしまう。
しかも、/usr/local/bin
にPATH
が通っているため、どうしようもなくなってしまったのだ。
解決編
たまたま友人が同じサーバにログイン可能で、起動スクリプトにtmuxの起動スクリプトが走っていなかったため、そちらから/usr/local/bin/tmux
を消してもらい、ことなきを得た。
ただ、毎回こんなラッキーな状態になるとはとても思えないので、その他の解決方法も一応書いておく。
やり方は単純で、強制的にシェルモードのsh
を起動した後に当該ファイルを消すだけだ。
# ssh <server> /bin/sh
# cd /usr/local/bin
# sudo -S rm tmux
結論
- 不用意に今入っているソフトの最新版をビルドしてパスが通っているところに置かない
- しかも、共用のパスに置くとかタチが悪すぎる。もっと反省して
- サーバー常駐型のソフトをバージョンアップするときには、きちんと後方互換性を確認してから作業する。
- 万が一バグっても大丈夫なように、安全なシェルは一つ以上(多ければ多いほど安心)用意する。
Discussion