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

thi*_*365 58 linux ssh terminal tmux

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

failed to connect to server: Connection refused
Run Code Online (Sandbox Code Playgroud)

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

har*_*dsv 61

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

在我的情况下,在大约8天不活动后,我无法重新连接:

$ tmux attach
no sessions
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

正如@ 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
Run Code Online (Sandbox Code Playgroud)

我也试过明确指定-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]
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一对我有用的东西.我做了一个愚蠢的事情,执行`rm -rf tmp/*`删除了tmux套接字文件.我一定会记住这个伎俩. (5认同)

Nat*_*han 32

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

对于那些正在考虑同样事情的人:重启后恢复tmux会话.帖子摘要:使用shell脚本构建tmux会话或创建精美的shell历史跟踪器.

  • 仅供参考:tmux会话在重新启动后不会保存,因为它们只是在计算机关闭时结束的后台进程. (10认同)

git*_*rik 16

如果没有会话打开,您确实会收到此错误.如果没有打开会话,则没有tmux服务器正在运行,因此无法连接到该服务器.

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

tmux new -s name1
tmux new -s name2
Run Code Online (Sandbox Code Playgroud)

这些将在具有默认套接字名称的服务器上创建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)
Run Code Online (Sandbox Code Playgroud)

并且您在默认套接字上看到服务器上运行的所有会话.您可以使用以下方法重新连接其中一个:

tmux attach -d -s name1
Run Code Online (Sandbox Code Playgroud)

-s指定会话的名称
-d将其与之前的客户端分离(如果已附加)

您还可以使用choose-tree默认分配给击键的命令 C-s(前缀键+ s)在tmux内的会话之间切换.这就是我通常做的事情.


Abe*_*ker 15

当Ubuntu桌面崩溃并且我的gnome-terminal窗口退出时,这发生在我身上.我仍然可以看到tmux进程正在运行(ps aux | grep tmux)但由于某种原因,tmux命令无法列出现有会话.显然它没有找到仍在运行的tmux进程的现有Unix套接字.此方案中的修复是找到现有的Unix套接字并使用该-S标志指定tmux ; 这是如何做:

您可以使用以下命令找到仍在运行的tmux进程的PID:

ps -p $(pidof tmux)
Run Code Online (Sandbox Code Playgroud)

现在拿你的PID(在我的例子中,6876)并运行它来列出任何打开的Unix套接字:

sudo lsof -Uap 6876
Run Code Online (Sandbox Code Playgroud)

希望你看到这样的输出:

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
Run Code Online (Sandbox Code Playgroud)

现在您可以将现有的Unix套接字指定为tmux命令(使用-S标志),并且您应该能够列出会话并正确附加:

tmux -S /tmp/tmux-1000/default list-sessions
tmux -S /tmp/tmux-1000/default attach -t 0
Run Code Online (Sandbox Code Playgroud)


Ros*_*one 9

您的错误可能有误.tmux.conf.我遇到了这个问题,直到我从我的这条线上拿出这条线.tmux.conf:

set-window-option -g xterm-keys on
Run Code Online (Sandbox Code Playgroud)

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

  • 它在哪里打印日志?它应该是控制台输出吗? (2认同)

小智 6

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


7he*_*.tk 6

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

  PID TTY      STAT   TIME COMMAND
19229 pts/1    S+     0:00 tmux
19231 ?        Ss     0:00 tmux
Run Code Online (Sandbox Code Playgroud)

这表明客户端实际上在服务器之前启动(可以假设它分叉了它)。


分离/重新连接后,相同的ps命令输出:

  PID TTY      STAT   TIME COMMAND
19231 ?        Ss     0:00 tmux
19290 pts/1    S+     0:00 tmux attach
Run Code Online (Sandbox Code Playgroud)

这将 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)
Run Code Online (Sandbox Code Playgroud)

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


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

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


特尔;博士:

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

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


Lar*_*off -4

尝试tmux -L name1 list-session

  • 问题的**第一个**词是“为什么”。这个答案甚至没有试图传达。另外,该命令在我的情况下实际上失败了(但是,“tmux -L list-session”神奇地工作了 - 现在我必须深入了解为什么,为什么不是前者,如何等等。所以基本上我必须回答OP的问题我)。 (35认同)
  • @whyisyoung 不幸的是,SO 不允许在几分钟后取消对评论的投票。但你的评论极具误导性。您使用“tmux -L list-session”执行的操作是**启动一个新的** tmux 实例,并使用名为“list-session”的套接字。这完全是误导性的,因为命令显示:“使用 tmux 列出设置了 -L 标志的会话”。考虑到该评论的危害性,您应该删除该评论(因为您无法再编辑)。 (7认同)
  • @7heo.tk 抱歉我不记得当时发生了什么。然后我尝试了命令`tmux -L list-session`,它确实启动了一个新的**实例**,而不是**会话**。谢谢你的评论。 (3认同)