セッションを一覧表示しようとすると、tmuxから「サーバーへの接続に失敗しました」というメッセージが表示されるのはなぜですか?
質問
これが私に何が起こっているのかです:を使用してtmuxセッションを開始します tmux -L name1
, tmux -L name2
;次に、私はそれらを使用してデタッチします ctrl+B+d.それから私は自分のコンピュータ上で現在実行中のセッションのリストを取得しようとします。しかし、私が走ったとき tmux ls
, 、私はエラーメッセージが表示されます:
failed to connect to server: Connection refused
これはバグですか?私はscreenに精通しています;私は考えています screen -ls
私はセッションを開始し、私はそれに接続する次回の前に数週間のために実行されているままにすることができるので、非常に便利な機能として。このため、現在実行中のtmuxセッションをリストする機能は私にとって非常に重要です。なぜですか tmux ls
tmuxが実行されていることがわかっているときに「接続が拒否されました」エラーを返しますか?
解決
tmux -L name1 list-session
を試してください。
他のヒント
tl; dr: TMUXサーバプロセスにSIGUSR1
信号を送信してみてください。
私の場合は、約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 Manページでは、TMUXがソケットファイルを再作成するように読んでください。したがってみましたが、すぐにセッションとReAttachを見つけることができました。
.$ kill -s USR1 7139
$ tmux ls
0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62]
これは私にセッションを実行していないときに私に起こります。私はTMUXを使い始めていて、あなたがあなたのコンピュータを再起動したならば、あなたが私を最初に驚かせたあなたのセッションを失いました。
同じことを考えている人のために:再起動後のTMUXセッションの復元。POSTの概要:シェルスクリプトを使用してTMUXセッションを構築するか、またはファンシーシェル履歴トラッカー
セッションが開いていない場合は、このエラーが発生します。セッションが開いていない場合は、TMUXサーバーが実行されていないため、接続できません。
-L
オプションを指定すると、TMUX Serverが使用するソケット名を変更すると、セッションに名前を付ける方法ではありません。次のコマンドを使用するには、次のコマンドを使用します。
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)
.
およびデフォルトソケットのサーバー上で実行されているすべてのセッションが表示されます。あなたはそれらのうちの1つを使って再現することができます:
tmux attach -d -s name1
.
-s
セッションの名前を指定します。
-d
はそれを以前のクライアントから切り離します(接続されている場合)
デフォルトでは、keystroke choose-tree
(プレフィックスキー+ S)に割り当てられているC-s
コマンドを使用してTMUX内のセッションを切り替えることもできます。これが私が普段していることです。
これは、Ubuntuデスクトップがクラッシュし、私のgnome-terminalウィンドウが終了したときに私に起こりました。私はまだtmuxプロセスが実行されているのを見ることができました(ps aux | grep tmux
)しかし、何らかの理由でtmuxコマンドは既存のセッションを一覧表示するために機能しません。どうやら、まだ実行中のtmuxプロセスの既存のUnixソケットを見つけていなかったようです。このシナリオでの修正は、既存のUnixソケットを見つけて、tmuxに指定することです。 -S
旗;ここではどのようにです:
まだ実行中の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
これで、tmuxコマンドに既存のUnixソケットを指定することができます(使用して、tmuxコマンドに既存のUnixソケットを指定できます -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つの簡単な修正は、例えば、$ rm -rf /tmp/tmux-xxx/
を実行することによって、TMUXサーバによって残されたTMPファイルを削除することです。
次のTMUX(1)
の出力に示すように、Cirginal Process(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
の出力を見ると、どちらの場合(pid
のtmux attach
の変更を無視します):
pstree -p
init(1)─┬─acpid(1824)
├─cron(1859)
⋮
├─sh(14146)───tmux(19229)
└─tmux(19231)───sh(19233)───pstree(19234)
.
は、クライアントプロセス(PID pstree
)で入力されたコマンド(この場合は19229
)がサーバー1で実行されます(PID 19231
)ことが sighup クライアント端末が紛失した場合(たとえばSSH経由)。
質問OP氏は、tmux
がfailed to connect to server: Connection refused
を返す場合に何が起こるか、サーバープロセス(私たちの場合のPID 19231)がどんな理由であっても(サーバープロセスが亡くなったためです。) tmux
クライアントを実行するユーザーは、TMUXソケットなどにアクセスする権限を持っていないためです。)
その場合解決策は、grep
プロセス(例えば、tmux
を介して)のps
であり、サーバが疑問があるためにこのエラーが発生しなかったことを祈る(そこでlsof
を使用してソケットを取得することで添付することができる)。聴きます)。それ以外の場合は、再起動後のようにデッドのように、サーバーに attach>を添付する方法はありません。
TL; DR:
このエラーは、バグからクリティカル障害までの範囲の複数の理由で与えることができます(プログラムが亡くなりました)。 Nutshellでは、廃棄時にUNIXツールを使用して、tmux
がまだ実行されているのかを判断します(TMUXクライアントが実行されている場合は少なくとも2つのプロセスがあるはずです。したがって、あなたがあなたのセッションを失った場合、またはそうでなければ。
注意:他の回答が指摘されると、このエラーが表示された理由がソケットエラーである場合は、tmux
フラグを使用して、特定のソケットを使用するようにtmux attach
に指示することができます。
私はTMUXの内部に別のプログラムを使用していました(ReatTach-to-user-namespace)、ReatTach-to-user-namespaceがインストールされていないため、コンピュータを切り替えたときにこのエラーが発生しました。修正は、単にbrew install reattach-to-user-namespace
を実行することでした。
これは、/tmp/*
内のファイルを削除した場合にも発生する可能性があります。これらのファイルを回復できない場合は、すべてのセッションデータが失われます。すべてのTMUXインスタンスを殺して再起動することは残念ながら残された唯一の選択肢です。