web-dev-qa-db-ja.com

セッションをリストしようとすると、tmuxから「サーバーへの接続に失敗しました」というメッセージが表示されるのはなぜですか?

これが私に起こっていることです:tmux -L name1tmux -L name2;を使用してtmuxセッションを開始します。それから私はそれらを使用してデタッチします ctrl+B+d。次に、コンピューターで現在実行中のセッションのリストを取得しようとします。ただし、tmux lsを実行すると、エラーメッセージが表示されます。

failed to connect to server: Connection refused

これはバグですか?私はスクリーンに精通しています。 screen -lsは非常に便利な機能であると考えています。セッションを開始し、次回セッションに接続するまで数週間実行し続ける可能性があるためです。このため、現在実行中のtmuxセッションをリストする機能は非常に重要です。 tmuxが実行されていることがわかっているときにtmux lsが「接続拒否」エラーを返すのはなぜですか?

57
thinke365

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 lsfailed 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]
56
haridsv

これは、セッションを実行していないときに起こります。 tmuxを使い始めたばかりで、コンピューターを再起動するとセッションが失われ、最初は驚いたことに気付きませんでした。

同じことを考えている人のために: 再起動後にtmuxセッションを復元する 。投稿の要約:シェルスクリプトを使用してtmuxセッションを構築するか、空想的な Shell history tracker を作成します。

32
Nathan

開いているセッションがない場合、実際にこのエラーが発生します。開いているセッションがない場合は、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内のセッションを切り替えることもできます。これは私が通常行うことです。

16
gitaarik

これは、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
15
Abe Voelker

.tmux.confにエラーがある可能性があります。 .tmux.confからこの行を取り出すまで、この問題がありました。

set-window-option -g xterm-keys on

tmux -vを試してから、出力されるログを確認することもできます。

9
Rose Perrone

1つの簡単な修正方法は、tmuxサーバーが残したtmpファイルを削除することです。たとえば、$ rm -rf /tmp/tmux-xxx/

6
Shumin Guo

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 attachpidの変更を無視します):

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が尋ねた質問:tmuxfailed to connect to server: Connection refusedを返す場合に何が起こるかは、理由が何であれ(サーバープロセスが停止したためである可能性があります)、サーバープロセス(この場合はpid 19231)に到達できないことです;また、tmuxクライアントを実行しているユーザーには、tmuxソケットなどにアクセスするためのアクセス許可がないため)

その場合の解決策は、grepプロセスのtmux(たとえばps経由)であり、サーバーが停止したためにこのエラーが発生しないように祈ります(したがって、lsofを使用して、リッスンするソケットを取得できます) )。それ以外の場合、サーバーにattachする方法はありません。再起動後と同じように死んでいます。


TL; DR:

このエラーは、バグから重大な障害(プログラムの停止)まで、さまざまな理由で発生する可能性があります。簡単に言えば、UNIXツールを自由に使用して、tmuxソケットがまだ実行されている場合に使用するソケットを決定します(tmuxクライアントを実行している場合は、少なくとも2つのプロセスが必要です-これはtmuxまたはtmux attachシェルから)、したがって、セッションを失ったかどうか。

注:他の回答が指摘したように、このエラーが表示される理由がソケットエラーである場合、-Lフラグを使用して、tmuxに特定のソケットを使用するように指示できます。

4
7heo.tk

Tmux内で別のプログラム(reattach-to-user-namespace)を使用していましたが、reattach-to-user-namespaceがインストールされていないため、コンピュータを切り替えたときにこのエラーが発生していました。修正は、単にbrew install reattach-to-user-namespaceを実行することでした。

3
akofink

これは、あなたまたはクリーニングプロセスが/tmp/*。これらのファイルを回復できない場合、セッションデータはすべて失われます。残念ながら、すべてのtmuxインスタンスを強制終了して再起動することが唯一の選択肢です。

3
Pierre Maoui