当我尝试列出会话时,为什么从tmux获得“无法连接到服务器”消息?

下面是发生在我身上的事情:我使用tmux -L name1tmux -L name2来启动tmux会话; 然后我用ctrl + B + d对它们进行解锁。 然后我尝试获取我的电脑上正在运行的会话列表。 但是,当我运行tmux ls ,出现错误消息:

 failed to connect to server: Connection refused 

这是一个错误? 我对屏幕很熟悉; 我认为screen -ls是一个非常有用的function,因为我可能会开始一个会话,并在下一次附加它之前让它运行几个星期。 因此,列出当前正在运行的tmux会话的能力对我来说非常重要。 为什么当我知道tmux正在运行时, tmux ls返回“连接被拒绝”错误?

尝试tmux -L name1 list-session

当我没有任何会话运行时,这发生在我身上。 我刚刚开始使用tmux,并没有意识到,如果你重新启动你的电脑,你会失去你的会议,我首先感到吃惊。

对于那些正在考虑同样的事情的人: 重启后恢复tmux会话 。 post总结:使用shell脚本来构build你的tmux会话或创build一个奇特的shell历史跟踪器 。

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错误。 我validation了属于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,但没有帮助。 但是,我在tmux手册页上读到发送SIGUSR1将使tmux重新创build套接字文件,所以我试过,我能够立即find会议和重新连接:

 $ kill -s USR1 7139 $ tmux ls 0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62] 

Ubuntu桌面崩溃,我的gnometerminal窗口退出,这发生在我身上。 我仍然可以看到tmux进程正在运行( ps aux | grep tmux ),但由于某些原因tmux命令无法列出现有的会话。 显然,它没有find仍在运行的tmux进程的现有Unix套接字。 在这种情况下的修复是find现有的Unix套接字,并使用-S标志指定tmux; 就是这样:

你可以用下面的命令find你正在运行的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套接字(使用-S标志),你应该能够列出会话并正确连接:

 tmux -S /tmp/tmux-1000/default list-sessions tmux -S /tmp/tmux-1000/default attach -t 0 

如果没有会话打开,你会得到这个错误。 如果没有会话打开,则没有tmux服务器在运行,所以无法连接到它。

使用-L选项,可以更改tmux服务器使用的套接字名称,但不能为您的会话命名。 你最好使用下面的命令:

 tmux new -s name1 tmux new -s name2 

这些会使用默认套接字名称在服务器上创build2个会话。 现在你可以做:

 $ 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会将其从之前的客户端分离(如果已连接)

您还可以在tmux内的会话之间切换,默认情况下,该命令将被分配给按键Cs (前缀键+ s)。 这是我通常做的。

您的.tmux.conf可能有错误。 我有这个问题,直到我从我的.tmux.conf取出这一行:

 set-window-option -g xterm-keys on 

您也可以尝试tmux -v ,然后查看它打印的日志。

我正在使用tmux(reattach-to-user-namespace)中的另一个程序,当我切换计算机时出现此错误,因为未安装重新附加到用户名称空间。 解决方法是简单地运行brew install reattach-to-user-namespace

一个简单的解决方法是删除tmux服务器留下的tmp文件,例如,通过执行$ rm -rf /tmp/tmux-xxx/

TMUX(1)工作方式是让一个客户端进程( tmux )连接到一个服务器进程( tmux也是,但不连接到TTY),如以下ps输出所示:

  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问:在tmux返回failed to connect to server: Connection refused的情况下会发生什么failed to connect to server: Connection refused是服务器进程(我们的情况是pid 19231)无法访问,无论原因(可能是因为服务器进程死了;还因为执行tmux客户端的用户没有访问tmux套接字的权限等)

在这种情况下,解决scheme是greptmux进程(例如通过ps ),并祈祷,你没有得到这个错误,因为服务器死亡(所以你可以附加到它通过使用lsof来获取它监听的套接字)。 否则,无法连接到服务器,因为它像重启后一样死亡。


TL; DR:

这个错误可以由多种原因给出,从错误到严重失败(程序死亡)。 简而言之,可以使用UNIX工具来确定tmux使用的套接字是否仍在运行(如果您正在运行tmux客户端,至less应该有两个进程,即在调用tmuxtmux attach之后shell),因此,如果你失去了你的会议。

注意:正如其他答案指出的那样,如果显示此错误的原因是套接字错误,则可以使用-L标志来告诉tmux使用特定的套接字。

如果您或任何清理过程删除/tmp/*文件,则可能会发生这种情况。 如果无法恢复这些文件,所有会话数据都将丢失。 杀死所有tmux实例并重新启动它是遗憾的唯一select。