tmuxによる仮想端末上で、apt-get upgrade などのコマンドでシステムをアップデートしたとき、
tmux自体も同時にアップデートされたようだ。
何も考えずに、システムアップデート作業中のこのtmux仮想端末をデタッチした。
しばらくして再び、tmux attach して「仮想端末」にアクセスしようとすると、次のエラーが発生した。
root@raspberrypi:~# tmux attach
protocol version mismatch (client 8, server 6)
■その理由
原因はすぐに予想できた。
システムアップデートでtmuxパッケージが更新された。
このアップデートでも、メモリ上に存在し続けている「tmuxプロセス」自体はアップデートの影響を受けず、古いバージョンのままである。
しかし、tmux仮想端末をデタッチし再びアタッチしようとすると、
アタッチを行うプロセス(client)はパッケージ更新後の新しいバージョンになっている。
新しいバージョンのクライアントから、 古いバージョンのサーバープロセスに接続できないので、さきのエラーとなるのだろう。
■対策
1、まず、現在接続不能になっている古いサーバープロセスの番号を調べる。
root@raspberrypi:~# pgrep tmux
21222、次のようにして、調べたプロセス番号を指定し、クライアントとして実行する。
root@raspberrypi:~# /proc/2122/exe attach
[exited]
無事にtmuxセッションへ再接続できた。
■考察
次のように、exeが、tmuxへシンボリックリンクになっていることがわかった。
root@raspberrypi:~# pgrep tmux
28066
root@raspberrypi:~# ls -all /proc/28066/exe
lrwxrwxrwx 1 root root 0 Jan 6 14:13 /proc/28066/exe -> /usr/bin/tmux
この方法が通じるのは、tmux がサーバーとクライアントで同じ型のプログラムを使っているからだろう。
たぶん、残存しているサーバーの「プロセス」に対して、これと同じプログラムをクライアントとして、接続するわけである。
しかし、 exeは実体ファイルへのシンボリックリンクである。
だから、システムのアップデートでtmuxが更新されれば、
リンクされている実体ファイルは、新しいバージョンに更新されると思う。
したがって、さきの方法「exe attach」で実行されるクライアントプログラムも、
新しいバージョンのものになってしまうだろうと思う。
どうして、さきの方法で、バージョンの不適合エラーを回避できたのかわからない。
<参考>
・Peter Van Eynde Shared publicly - May 7, 2013
< https://plus.google.com/110139418387705691470/posts/BebrBSXMkBp > 2015年1月6日
・protocol version mismatch (client 8, server 6) when trying to upgrade
< http://unix.stackexchange.com/questions/122238/protocol-version-mismatch-client-8-server-6-when-trying-to-upgrade > 2015年1月6日
・今週のお題 - /proc/プロセスID を探検する
< http://www.usupi.org/sysad/024.html > 2015年1月6日
・リンクについて
< http://cmd.misty.ne.jp/environment/03.html > 2015年1月6日