(無償) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

2015年1月6日火曜日

【Linux Raspbian】仮想端末tmuxでprotocol version mismatchエラーの発生原因と対処方法について

■tmux再接続ができなくなる問題発生の経緯

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
2122
2、次のようにして、調べたプロセス番号を指定し、クライアントとして実行する。
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日