Linux 为什么我会得到一个“a”;无法连接到服务器";当我尝试列出会话时来自tmux的消息?

Linux 为什么我会得到一个“a”;无法连接到服务器";当我尝试列出会话时来自tmux的消息?,linux,ssh,terminal,tmux,Linux,Ssh,Terminal,Tmux,下面是发生在我身上的事情:我使用tmux-L name1,tmux-L name2启动tmux会话;然后我使用ctrl+B+d对它们进行去跟踪。然后,我尝试获取计算机上当前正在运行的会话的列表。但是,当我运行tmux ls时,会收到一条错误消息: failed to connect to server: Connection refused 这是虫子吗?我熟悉屏幕;我认为screen-ls是一个非常有用的函数,因为我可能会启动一个会话,并在下次连接它之前让它运行数周。因此,列出当前正在运行的t

下面是发生在我身上的事情:我使用
tmux-L name1
tmux-L name2
启动tmux会话;然后我使用ctrl+B+d对它们进行去跟踪。然后,我尝试获取计算机上当前正在运行的会话的列表。但是,当我运行
tmux ls
时,会收到一条错误消息:

failed to connect to server: Connection refused

这是虫子吗?我熟悉屏幕;我认为
screen-ls
是一个非常有用的函数,因为我可能会启动一个会话,并在下次连接它之前让它运行数周。因此,列出当前正在运行的tmux会话的能力对我来说非常重要。当我知道tmux正在运行时,为什么
tmux ls
返回“连接被拒绝”错误?

尝试
tmux-L name1列表会话

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

set-window-option -g xterm-keys on

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

当我没有任何会话运行时,这种情况会发生。我刚开始使用tmux,没有意识到如果你重新启动你的电脑,你会失去你的会话,这让我一开始很惊讶


对于那些有相同想法的人:。这篇文章的摘要:使用shell脚本构建您的tmux会话或创建一个新的会话。

我在tmux中使用了另一个程序(重新附加到用户名称空间),当我切换计算机时,由于未安装“重新附加到用户名称空间”,我遇到了这个错误。修复方法是简单地运行
brew install reattach to user namespace

如果没有打开的会话,则会出现此错误。如果没有打开会话,则没有运行tmux服务器,因此无法连接到该服务器

使用
-L
选项,您可以更改tmux服务器使用的套接字名称,这不是命名会话的方法。您最好使用以下命令:

tmux new -s name1
tmux new -s name2
这将在服务器上创建两个会话,使用默认套接字名称。现在您可以执行以下操作:

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


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

一个简单的修复方法是删除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 attach的
pid
更改):

清楚地显示在客户端进程(PID
19229
)中键入的命令(
pstree
,在本例中)由服务器一号(PID
19231
)执行,从而允许在客户端终端丢失的情况下(例如通过ssh)继续执行这些命令


现在,对于OP提出的问题:如果
tmux
返回
连接到服务器失败,会发生什么情况:连接被拒绝
是因为服务器进程(在我们的例子中是pid 19231)不可访问,不管是什么原因(可能是因为服务器进程死机;也可能是因为执行
tmux
客户端的用户没有访问tmux套接字的权限,等等。)

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


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


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

这发生在我身上,当时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

如果您或任何其他人
tmux -S /tmp/tmux-1000/default list-sessions
tmux -S /tmp/tmux-1000/default attach -t 0
$ tmux attach
no sessions
$ 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
COMMAND  PID  USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
tmux    7139 hari    5u  unix 0x0000000000000000      0t0 1712879255 /tmp/tmux-50440/default
$ kill -s USR1 7139
$ tmux ls
0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62]