😇

ubuntu20.04でtmux3.3aをビルドしてハマったりやらかした話

2023/08/10に公開

TL;DR

  • tmux3.0aでは使えない機能が使いたかった
  • ログイン時にtmuxのセッションを確認するようにしていた
  • tmux3.0a時のサーバーが起動していた
  • tmux3.3aでは、古いバージョンのサーバーが起動していると、「古いサーバーのやつが動いてるぜ」って言って何もしなくなるコマンドがいる
  • tmuxが動かなくなってログイン後の処理が死亡
  • 現在進行形で動いているソフトを不用意にアップデートするのはやめましょう
    • 特に他のユーザーも使っているような場合には絶対
    • 当たり前だけど忘れがちなので
  • 新バージョンのサーバー常駐ソフトを使うときには、きちんと旧バージョンを落とすようにしましょう。
    • 落とせない場合は作業をやめときましょう(なるべく)。
  • 更新作業を行う際には、安全(変更が影響しない)なシェルを常に確保しておきましょう

ubuntu20.04にtmux3.3aが入ってない

し、aptとかで入れることはできない。
ppaにもまともそうなのがないので、仕方なく手元でビルドすることに

はまりポイント1: ビルドに必要なパッケージが入らない

https://github.com/icyflame/install-from-source-tmux-3-3a
を参考にビルドしようとしたら、"libevent-2.1-7"がないと言われた。

sudo apt install libevent-2.1-7

を実行したところ、「もっと新しいやつが入っとる!入れんとくわ」と拒否られてしまった。

正解

https://stackoverflow.com/questions/21926202/libevent-not-found-error-in-tmux
この回答が正解。要は、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/binPATHが通っているため、どうしようもなくなってしまったのだ。

解決編

たまたま友人が同じサーバにログイン可能で、起動スクリプトにtmuxの起動スクリプトが走っていなかったため、そちらから/usr/local/bin/tmuxを消してもらい、ことなきを得た。

ただ、毎回こんなラッキーな状態になるとはとても思えないので、その他の解決方法も一応書いておく。

やり方は単純で、強制的にシェルモードのshを起動した後に当該ファイルを消すだけだ。

万が一コピペされるとまずそうなのでコメントアウト.bash
# ssh <server> /bin/sh
# cd /usr/local/bin
# sudo -S rm tmux

結論

  • 不用意に今入っているソフトの最新版をビルドしてパスが通っているところに置かない
    • しかも、共用のパスに置くとかタチが悪すぎる。もっと反省して
  • サーバー常駐型のソフトをバージョンアップするときには、きちんと後方互換性を確認してから作業する。
  • 万が一バグっても大丈夫なように、安全なシェルは一つ以上(多ければ多いほど安心)用意する。

Discussion