情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

tmuxでアタッチできない問題の原因と対策メモ(Ubuntu 16.04)

Ubuntu (27) Ubuntu 16.04 (6) byobu (2) tmux (3)

Ubuntu 16.04で新しくサーバーを構築したところ、tmux(byobu)を使用した状態で、ssh(mosh)を切断すると、そのtmuxサーバーに再度接続(アタッチ)しようとしても失敗してしまうようになりました。

この原因について調べたり、対策したことをメモしておきます。

今まで

今まで利用していたUbuntu 14.04やCentOSのサーバーでは、ssh(実際使っているのは主にmosh)の切断後、再接続時にもう一度tmux(byobu)からアタッチすることができました。

※Mosh接続・SSH接続は、Windows 10 Pro上のMobaXTermから使用。MobaXTermお手軽でおすすめです。

再接続後アタッチできない

しかし、最近構築したUbuntu 16.04.2 LTS の環境では、サーバーにmoshで再接続(再ログイン)してからtmux a(tmux attach)を実行しても、アタッチすることができませんでした

$ tmux attach
no sessions

その他、セッションの一覧を表示しようとしても、以下のエラーになってしまいました。

$ tmux ls
no server running on /tmp/tmp.xxxxxxxxxx/tmux-1000/default
$ tmux ls
error connecting to /tmp/tmp.xxxxxxxxxx/tmux-1000/default (No such file or directory)

プロセスは生きている

しかし、さっとhtopでプロセスを確認してみると、

tmux -u -2 -f /usr/share/byobu/profiles/tmuxrc new-session -n - /usr/bin/byobu-shell

のプロセスが、多数生存していることが分かりました。つまり、tmuxが終了してしまったわけではなく、どうやら単純にアタッチできない状態になってしまったようです。

環境変数TMPDIRが接続するたびに変わる

調べているうちに、次の記述に遭遇しました。

mux stores its server socket in a directory under the directory specified by the TMPDIR environment variable. 引用元

ここでようやく、再接続するたびに、サーバーソケット(セッション情報)の保存先フォルダが、「/tmp/tmp.7wkYAmTtpj/tmux-1000/default」や「/tmp/tmp.FXX9UpjXy4/tmux-1000/default」など、いろいろと変わっていることに気が付きました。

そして、「$ echo $TMPDIR」してみると、「/tmp/tmp.FXX9UpjXy4」が指定されており、tmuxが利用するtmpディレクトリとして、このディレクトリが利用され、この環境変数TMPDIRが、接続するたびに変わってしまっているために、前回接続時と同じセッション情報を利用できないことが分かりました。

以前から使っている正常な環境では、TMPDIRが未設定であるため、デフォルトの「/tmp」が使用され、そのまま「/tmp/tmux-1000/default」にセッション情報が保存されていることが分かりました。

なぜTMPDIRが設定されてしまうのか

すると気になるのが、なぜTMPDIRの設定状況に違いが出るのか、誰が毎回ご丁寧に乱数tmpディレクトリを作ってくれているのか、という点です。

まず、moshではなく純粋にssh接続してみたところ、そちらでも同様に、また違うTMPDIRが設定されていました。

さくらのVPSだったので、シリアルコンソールからログインしてみましたが、それでもTMPDIRが設定されました。

「tmp.XXXXXXXXXX」を作るコマンド「mktemp」

さらに追加で調べると、「mktemp」というコマンドが、「tmp.XXXXXXXXXX」という形式のディレクトリを自動作成してくれるコマンドとして用意されていることが分かりました。

unset TMPDIRしてみる

このあたりまで調べて、あまり同じ症状の人が見つけられなかったので、ひとまず「~/.zshrc」の最後に「unset TMPDIR」を書き足して、再ログインしてみました。

すると、無事、再接続後のアタッチに成功しました

しかし、これだと必要なtmux用のtmpdir設定が、すべてに影響を与えてしまって、セキュリティ恒常的な意味を含んでいるのであればちょっともったいない気もしました。

TMUX_TMPDIRが使えそう

そこからさらに調べを進めると、次の書き込みを見つけました。

OS X plays silly buggers with TMPDIR, either run tmux from master where we don't use TMPDIR or set TMUX_TMPDIR. 引用元

どうやら、TMUX_TMPDIRが設定されていれば、tmuxはそちらを使ってくれるようです。

そこで、「~/.zshrc」に「export TMUX_TMPDIR=/tmp/tmp.tmux」を書くという対策をしてみたところ、最初にbyobu/tmuxを立ち上げる時点で「can't create socket: No such file or directory」エラーになってしまいました。

そこで一度「$ mkdir -m700 /tmp/tmp.tmux」でフォルダを用意したところ、無事、再接続時にアタッチすることができました

/tmpの中身は消えるから作り直す必要が出てくる問題へ対策

しかし今度はtmpディレクトリが消えたとき、再び/tmp/tmp.tmuxフォルダを作り直す必要がある、という問題がありました。

そこで、存在しない場合は作り直す、のような処理を.zshrcでする手も考えたものの、結局それって初めから「export TMUX_TMPDIR=/tmp」にしてもほぼ一緒なのでは?と気づき、「.zshrc」の追加設定を「export TMUX_TMPDIR=/tmp」に変更するという対策を実施しました

ひとまずこれで、今まで通り、再接続後にtmux/byobuを継続して利用できる(アタッチに成功する)ようになりました。

コメント(0)

新しいコメントを投稿




  • カテゴリ ナビ
  • 著者紹介

    ブログが趣味で、スマホアプリの利用中に発生するトラブルや不具合の対策手順や障害情報、 設定の変更方法などについて、解説記事をよく書いています。

    自分が困ったことをブログに書けば、次に困る人の参考になって、みんながみんな同じ苦労をせずに済む、というのが原点です。

    最近の関心は、スマホやパソコンが苦手な人の行動や思考、そしてそんな人を手助けする方法です。

    Amazonのアソシエイトとして、did2は適格販売により収入を得ています。

    RSS | Facebook | Twitter | About