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

时间:2012-03-12 14:18:07

标签: linux ssh terminal 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会返回“连接被拒绝”错误?

10 个答案:

答案 0 :(得分:48)

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,但它没有帮助。但是,我在tmux手册页中读到,发送SIGUSR1将使tmux重新创建套接字文件,所以我尝试了,我能够立即找到会话并重新连接:

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

答案 1 :(得分:32)

当我没有任何会话运行时,这种情况发生在我身上。我刚刚开始使用tmux,并没有意识到,如果你重新启动计算机,你会失去你最初让我感到惊讶的会话。

对于那些正在考虑同样事情的人:Restore tmux session after reboot。帖子摘要:使用shell脚本构建你的tmux会话或创建一个花哨的shell history tracker

答案 2 :(得分:14)

如果没有会话打开,您确实会收到此错误。如果没有会话打开,则没有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命令在tmux内部的会话之间切换,该命令默认分配给击键C-s(前缀键+ s)。这就是我通常做的事情。

答案 3 :(得分:14)

当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

答案 4 :(得分:9)

您的.tmux.conf可能有错误。我遇到了这个问题,直到我从我的.tmux.conf

中取出这一行
set-window-option -g xterm-keys on

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

答案 5 :(得分:6)

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

答案 6 :(得分:3)

我正在使用tmux中的另一个程序(reattach-to-user-namespace),当我切换计算机时我收到了这个错误,因为没有安装reattach-to-user-namespace。修复只是运行brew install reattach-to-user-namespace

答案 7 :(得分:3)

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的输出,我们会在两种情况下都看到(忽略pid的{​​{1}}更改):

tmux attach

清楚地显示客户端进程(PID pstree -p init(1)─┬─acpid(1824) ├─cron(1859) ⋮ ├─sh(14146)───tmux(19229) └─tmux(19231)───sh(19233)───pstree(19234) )中键入的命令(在这种情况下为pstree)由服务器1执行(PID 19229),从而允许它们执行如果客户终端丢失(例如,通过ssh),则在没有SIGHUP的情况下继续。

现在,对于OP问的问题:在19231返回tmux的情况下发生的情况是服务器进程(在我们的情况下为pid 19231)无法访问,无论原因是什么(可能是因为服务器进程已经死亡;但也因为执行failed to connect to server: Connection refused客户端的用户没有访问tmux套接字等的权限。)

在这种情况下的解决方案是tmux进程grep进程(例如通过tmux),并祈祷您没有收到此错误,因为服务器已经死亡(所以您可以使用ps来附加它,以获取它侦听的套接字)。否则,无法附加到服务器,因为它像重启后一样死机。

TL; DR:

可以出于多种原因发出此错误,从错误到严重失败(程序死亡)。简而言之,使用您可以使用的UNIX工具来确定lsof使用哪个套接字,如果它仍在运行(如果您运行tmux客户端,则至少应该有两个进程 - 在调用{{}之后发生来自shell的1}}或tmux因此如果您丢失了会话。

注意:正如其他答案所指出的,如果显示此错误的原因是套接字错误,您可以使用tmux标志告诉tmux attach使用特定套接字

答案 8 :(得分:3)

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

答案 9 :(得分:-1)

尝试tmux -L name1 list-session