誰かが消している
tmux を使っていると何故か tmux の unix ドメインソケット (以後「ソケット」) がいつの間にか消されることがあります。こうなると何が困るって、このソケットを読み書きしているコマンドが軒並み error connecting to /private/var/folders/<中略>/T/tmux-501/default (No such file or directory)
というエラーメッセージを出して機能してくれなくなります。例えばtmux使用時にmanページを新規ウィンドウ表示なんて便利なものが無粋なことにエラーメッセージを吐いて停まってしまうことになります。そして detach したら最後 tmux attach
してもつなぎ直せなくなります。
勝手に消されることは解決法が見つからず藁にもすがる思いで質問をしてみました。こちらは親切な方からの回答待ちです。
謎は残るがソケットは復活できる
それはそれとして、消えたソケットファイルを復活させる方法はあります。tmux のマニュアルに以下の記述があります;
If the socket is accidentally removed, the SIGUSR1 signal may be sent to the tmux server process to recreate it (note that this will fail if any parent directories are missing).
テキトーに翻訳すると
「ソケットファイルが消えたら SIGUSR1 シグナルを tmux サーバプロセスに送ると作りなおすよ (ただし親ディレクトリがないと失敗するよ)」
とかいう意味のことが書いてあります。で、そのとおり
% mkdir -m700 /private/var/folders/<中略>/T/tmux-501
% killall -SIGUSR1 tmux
とやってみると見事ソケットファイルが復活します。誰かが消している件は依然として解決しませんが、とりあえずなんとか使い続けることができそうです。
zshの関数にまとめる
このソケットファイルの在処はシェル変数 $TMUX
で参照できます。そこでこれを利用してソケットを復活させる zsh の関数を書いてみます。
function tmux-remake-socket () {
if [ ! $TMUX ]; then
return
fi
tmux_socket_file=`echo $TMUX|awk -F, '{print $1}'`
if [ ! -S $tmux_socket_file ]; then
mkdir -m700 `dirname $tmux_socket_file` 2> /dev/null
killall -SIGUSR1 tmux
else
echo tmux unix domain socket exists! nothing to do.
fi
unset tmux_socket_file
}
私みたいなトラブルを抱えている人はいないとは思いますが、自分のためにもまとめておきます。