スポンサーリンク
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)
新しいコメントを投稿
|HOME|
『「tail -f」の出力の一部に色を付けて見やすくする』 OLD >>
スポンサーリンク