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
这是一个错误吗?我熟悉屏幕; 我认为这screen -ls是一个非常有用的功能,因为我可能会开始一个会话,并在下次连接之前让它运行数周.因此,列出当前运行的tmux会话的能力对我来说非常重要.tmux ls当我知道tmux正在运行时,为什么会返回"连接被拒绝"错误?
har*_*dsv 61
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]
Nat*_*han 32
当我没有任何会话运行时,这发生在我身上.我刚刚开始使用tmux,并没有意识到,如果你重新启动计算机,你会丢失你的会话,这让我一开始感到惊讶.
对于那些正在考虑同样事情的人:重启后恢复tmux会话.帖子摘要:使用shell脚本构建tmux会话或创建精美的shell历史跟踪器.
git*_*rik 16
如果没有会话打开,您确实会收到此错误.如果没有打开会话,则没有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内的会话之间切换.这就是我通常做的事情.
Abe*_*ker 15
当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
您的错误可能有误.tmux.conf.我遇到了这个问题,直到我从我的这条线上拿出这条线.tmux.conf:
set-window-option -g xterm-keys on
您也可以尝试tmux -v然后查看它打印的日志.
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 19231) 执行,从而允许它们在客户端丢失的情况下在没有SIGHUP的情况下继续(例如通过 ssh) )。
现在,对于 OP 提出的问题:在tmux返回的情况下会发生什么情况failed to connect to server: Connection refused是服务器进程(在我们的例子中为 pid 19231)无法访问,无论是什么原因(可能是因为服务器进程死了;但也因为用户执行tmux客户端无权访问 tmux 套接字等)
在这种情况下,解决方案是grep针对tmux进程(ps例如通过),并祈祷您没有因为服务器死亡而收到此错误(因此您可以通过使用它lsof来获取它侦听的套接字来附加到它)。否则,无法连接到服务器,因为它就像重新启动后一样死机。
这个错误可能有多种原因,从错误到严重失败(程序死亡)。简而言之,使用您可以使用的 UNIX 工具来确定tmux使用的套接字是否仍在运行(如果您运行 tmux 客户端,则至少应该有两个进程 - 在调用tmux或tmux attach从 shell调用之后发生),因此如果您丢失了会话。
注意:正如其他答案所指出的,如果显示此错误的原因是套接字错误,则可以使用该-L标志来告诉tmux使用特定的套接字。
Lar*_*off -4
尝试tmux -L name1 list-session。
| 归档时间: | 
 | 
| 查看次数: | 52840 次 | 
| 最近记录: |