70

这是发生在我身上的事情:我使用tmux -L name1, tmux -L name2;开始 tmux 会话 然后我使用ctrl++将它们B分离d。然后我尝试获取计算机上当前正在运行的会话的列表。但是,当我运行时tmux ls,我收到一条错误消息:

failed to connect to server: Connection refused

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

4

10 回答 10

78

TL;DR:尝试向SIGUSR1tmux 服务器进程发送信号。

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

$ kill -s USR1 7139
$ tmux ls
0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62]
于 2017-01-02T06:16:28.790 回答
34

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

对于那些有同样想法的人:restore tmux session after reboot。帖子摘要:使用 shell 脚本构建您的 tmux 会话或创建精美的shell 历史跟踪器

于 2013-05-19T18:19:32.613 回答
19

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

于 2014-09-22T08:43:18.607 回答
17

当 Ubuntu 桌面崩溃并且我的 gnome 终端窗口退出时,这发生在我身上。我仍然可以看到 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
于 2016-01-11T04:52:47.230 回答
9

您的.tmux.conf. 我遇到了这个问题,直到我从我的.tmux.conf

set-window-option -g xterm-keys on

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

于 2013-03-17T16:40:22.017 回答
6

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

于 2015-01-12T20:38:42.240 回答
6

工作方式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变化tmux attach):

pstree -p
init(1)─┬─acpid(1824)
        ├─cron(1859)
        ⋮
        ├─sh(14146)───tmux(19229)
        └─tmux(19231)───sh(19233)───pstree(19234)

清楚地显示pstree在客户端进程(PID)中键入的命令(在这种情况下)19229由服务器一(PID)执行,因此在客户端丢失(例如通过 ssh)的情况下允许它们在没有SIGHUP19231的情况下继续)。


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

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


TL;博士:

此错误可能有多种原因,从错误到严重故障(程序死亡)。简而言之,使用您可以使用的 UNIX 工具来确定tmux使用什么套接字,如果它仍在运行(如果您有 tmux 客户端运行,则应该至少有两个进程 - 这发生在调用tmuxtmux attach从 shell 之后),因此如果您丢失了会话。

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

于 2015-05-13T09:52:14.220 回答
3

我在 tmux (reattach-to-user-namespace) 中使用了另一个程序,当我切换计算机时出现此错误,因为未安装 reattach-to-user-namespace。解决方法是简单地运行brew install reattach-to-user-namespace.

于 2014-06-11T12:46:55.830 回答
3

如果您或任何清理进程删除/tmp/*. 如果您无法恢复这些文件,您的所有会话数据都会丢失。不幸的是,杀死所有 tmux 实例并重新启动它是唯一的选择。

于 2016-02-10T15:18:07.363 回答
-3

试试tmux -L name1 list-session

于 2012-03-12T18:16:02.743 回答