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)
清楚地表明在客户端进程(PID 19229)中键入的命令(在这种情况下为pstree)由服务器一(PID 19231)执行,从而允许它们在没有SIGHUP 的情况下继续执行客户端丢失的事件(例如通过 ssh)。
现在,对于 OP 提出的问题:在tmux 返回failed to connect to server: Connection refused 的情况下会发生什么情况是服务器进程(在我们的例子中是 pid 19231)无法访问,无论是什么原因(可能是因为服务器进程死了;也因为执行tmux客户端的用户没有访问tmux套接字的权限等)
在这种情况下,解决方案是grep 处理tmux 进程(例如通过ps),并祈祷您没有因为服务器死机而收到此错误(因此您可以通过以下方式附加到它使用lsof 来获取它监听的套接字)。否则,无法附加到服务器,因为它就像重启后一样死机。
TL;DR:
这个错误可能有多种原因,从错误到严重故障(程序死亡)。简而言之,使用您可以使用的 UNIX 工具来确定 tmux 使用的套接字是否仍在运行(如果您正在运行 tmux 客户端,则应该至少有两个进程 - 这发生在调用 tmux 或tmux attach 来自 shell),因此如果您丢失了会话。
注意:正如其他答案所指出的,如果显示此错误的原因是套接字错误,您可以使用-L 标志告诉tmux 使用特定的套接字。