LoginSignup
18
13

More than 5 years have passed since last update.

tmux の unix ドメインソケットが消えた時の対処

Last updated at Posted at 2016-01-23

誰かが消している

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
}

私みたいなトラブルを抱えている人はいないとは思いますが、自分のためにもまとめておきます。

18
13
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13