これが私に起こっていることです:tmux -L name1
、tmux -L name2
;を使用してtmuxセッションを開始します。それから私はそれらを使用してデタッチします ctrl+B+d。次に、コンピューターで現在実行中のセッションのリストを取得しようとします。ただし、tmux ls
を実行すると、エラーメッセージが表示されます。
failed to connect to server: Connection refused
これはバグですか?私はスクリーンに精通しています。 screen -ls
は非常に便利な機能であると考えています。セッションを開始し、次回セッションに接続するまで数週間実行し続ける可能性があるためです。このため、現在実行中のtmuxセッションをリストする機能は非常に重要です。 tmuxが実行されていることがわかっているときにtmux ls
が「接続拒否」エラーを返すのはなぜですか?
TL; DR:SIGUSR1
シグナルをtmuxサーバープロセスに送信してみてください。
私の場合、約8日間何も操作しないと、再接続できませんでした。
$ tmux attach
no sessions
しかし、tmuxプロセスのgrepでこの出力が得られました。
$ ps -aef | fgrep -i tmux
hari 7139 1 1 2016 ? 2-20:32:31 tmux
hari 25943 25113 0 22:00 pts/0 00:00:00 fgrep --color=auto -i tmux
@ 7heo.tkが示唆するように、これはtmuxサーバーがまだ実行されているが、tmux ls
がfailed to connect to server: Connection refused
エラーを与えていたことを示します。 tmuxセッションに属するtmpディレクトリが存在し、lsof -p 7139
(tmuxサーバーのpid)がソケットファイルが開いていることを示したことを確認しました。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tmux 7139 hari 5u unix 0x0000000000000000 0t0 1712879255 /tmp/tmux-50440/default
-S /tmp/tmux-50440/default
をtmuxに明示的に指定しようとしましたが、役に立ちませんでした。しかし、SIGUSR1
を送信するとtmuxがソケットファイルを再作成することになるとtmuxのマニュアルページを読んだので、それを試してみたところ、すぐにセッションを見つけて再アタッチできました。
$ kill -s USR1 7139
$ tmux ls
0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62]
これは、セッションを実行していないときに起こります。 tmuxを使い始めたばかりで、コンピューターを再起動するとセッションが失われ、最初は驚いたことに気付きませんでした。
同じことを考えている人のために: 再起動後にtmuxセッションを復元する 。投稿の要約:シェルスクリプトを使用してtmuxセッションを構築するか、空想的な Shell history tracker を作成します。
開いているセッションがない場合、実際にこのエラーが発生します。開いているセッションがない場合は、tmuxサーバーが実行されていないため、接続できません。
-L
オプションを使用して、tmuxサーバーが使用するソケット名を変更します。これは、セッションに名前を付ける方法ではありません。次のコマンドを使用することをお勧めします。
tmux new -s name1
tmux new -s name2
これらは、サーバー上にデフォルトのソケット名で2つのセッションを作成します。できるようになりました:
$ tmux ls
name1: 1 windows (created Mon Sep 22 10:34:40 2014) [158x40] (attached)
name2: 1 windows (created Mon Sep 22 10:34:43 2014) [158x40] (attached)
そして、デフォルトソケットのサーバーで実行されているすべてのセッションが表示されます。次のいずれかを使用して、それらのいずれかを再接続できます。
tmux attach -d -s name1
-s
は、セッションの名前を指定します-d
は、以前のクライアントから接続を解除します(接続されている場合)
デフォルトでキーストロークchoose-tree
(プレフィックスキー+ s)に割り当てられるC-s
コマンドを使用して、tmux内のセッションを切り替えることもできます。これは私が通常行うことです。
これは、Ubuntuデスクトップがクラッシュし、gnome-terminalウィンドウが終了したときに起こりました。まだtmuxプロセスが実行されている(ps aux | grep tmux
)のを見ることができましたが、何らかの理由でtmuxコマンドが既存のセッションをリストするために機能しませんでした。どうやらまだ実行中のtmuxプロセスの既存のUnixソケットが見つかりませんでした。このシナリオでの修正は、既存のUnixソケットを見つけ、-S
フラグを使用してtmuxに指定することです。方法は次のとおりです。
これでまだ実行中のtmuxプロセスのPIDを見つけることができます:
ps -p $(pidof tmux)
PID(私の場合は6876)を取得し、これを実行して、開いているUnixソケットをリストします。
Sudo lsof -Uap 6876
次のような出力が表示されることを願っています。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tmux 6876 abe 3u unix 0x0000000000000000 0t0 408477 socket
tmux 6876 abe 4u unix 0x0000000000000000 0t0 408478 socket
tmux 6876 abe 6u unix 0x0000000000000000 0t0 408479 /tmp/tmux-1000/default
これで、既存のUnixソケットをtmuxコマンドに指定することができ(-S
フラグを使用)、セッションをリストして適切にアタッチできるはずです。
tmux -S /tmp/tmux-1000/default list-sessions
tmux -S /tmp/tmux-1000/default attach -t 0
.tmux.conf
にエラーがある可能性があります。 .tmux.conf
からこの行を取り出すまで、この問題がありました。
set-window-option -g xterm-keys on
tmux -v
を試してから、出力されるログを確認することもできます。
1つの簡単な修正方法は、tmuxサーバーが残したtmpファイルを削除することです。たとえば、$ rm -rf /tmp/tmux-xxx/
。
TMUX(1)
の動作方法は、次のtmux
の出力に示すように、クライアントプロセス(tmux
)をサーバープロセス(ps
も接続しますが、TTYに接続しません)に接続することです。
PID TTY STAT TIME COMMAND
19229 pts/1 S+ 0:00 tmux
19231 ? Ss 0:00 tmux
これは、クライアントがサーバーの前に実際に起動することを示しています(フォークすると想定できます)。
デタッチ/再アタッチ後、同じps
コマンドは次を出力します。
PID TTY STAT TIME COMMAND
19231 ? Ss 0:00 tmux
19290 pts/1 S+ 0:00 tmux attach
これにより、tmuxクライアントがtmux attach
として表示されるため、少しわかりやすくなります。
さて、上記の両方のケースでpstree
の出力を見ると、両方のケースで得られます(tmux attach
のpid
の変更を無視します):
pstree -p
init(1)─┬─acpid(1824)
├─cron(1859)
⋮
├─sh(14146)───tmux(19229)
└─tmux(19231)───sh(19233)───pstree(19234)
クライアントプロセス(PID 19229
)で入力されたコマンド(この場合はpstree
)がサーバー1(PID 19231
)によって実行されることを明確に示しているため、 [ 〜#〜] sighup [〜#〜] クライアント端末が失われた場合(たとえば、ssh経由)。
さて、OPが尋ねた質問:tmux
がfailed to connect to server: Connection refused
を返す場合に何が起こるかは、理由が何であれ(サーバープロセスが停止したためである可能性があります)、サーバープロセス(この場合はpid 19231)に到達できないことです;また、tmux
クライアントを実行しているユーザーには、tmuxソケットなどにアクセスするためのアクセス許可がないため)
その場合の解決策は、grep
プロセスのtmux
(たとえばps
経由)であり、サーバーが停止したためにこのエラーが発生しないように祈ります(したがって、lsof
を使用して、リッスンするソケットを取得できます) )。それ以外の場合、サーバーにattachする方法はありません。再起動後と同じように死んでいます。
このエラーは、バグから重大な障害(プログラムの停止)まで、さまざまな理由で発生する可能性があります。簡単に言えば、UNIXツールを自由に使用して、tmux
ソケットがまだ実行されている場合に使用するソケットを決定します(tmuxクライアントを実行している場合は、少なくとも2つのプロセスが必要です-これはtmux
またはtmux attach
シェルから)、したがって、セッションを失ったかどうか。
注:他の回答が指摘したように、このエラーが表示される理由がソケットエラーである場合、-L
フラグを使用して、tmux
に特定のソケットを使用するように指示できます。
Tmux内で別のプログラム(reattach-to-user-namespace)を使用していましたが、reattach-to-user-namespaceがインストールされていないため、コンピュータを切り替えたときにこのエラーが発生していました。修正は、単にbrew install reattach-to-user-namespace
を実行することでした。
これは、あなたまたはクリーニングプロセスが/tmp/*
。これらのファイルを回復できない場合、セッションデータはすべて失われます。残念ながら、すべてのtmuxインスタンスを強制終了して再起動することが唯一の選択肢です。