세션을 나열하려고 할 때 tmux에서 "서버에 연결하지 못했습니다"메시지가 표시되는 이유는 무엇입니까?
나에게 일어나는 일은 다음과 같습니다 . 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가 실행 중이라는 것을 알고 있는데 왜 "연결 거부"오류를 반환합니까?
시도해보십시오 tmux -L name1 list-session
.
SIGUSR1
요약 : tmux 서버 프로세스에 신호를 보내보십시오 .
제 경우에는 약 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/default
tmux에 명시 적으로 지정하려고 시도했지만 도움이되지 않았습니다. 그러나 tmux man 페이지에서 전송 SIGUSR1
하면 tmux가 소켓 파일을 다시 만들 수 있다는 내용을 읽었으므로 시도해 보았고 즉시 세션을 찾아 다시 연결할 수있었습니다.
$ kill -s USR1 7139
$ tmux ls
0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62]
이것은 실행중인 세션이 없을 때 발생합니다. 방금 tmux를 사용하기 시작했지만 컴퓨터를 다시 시작하면 처음에는 나를 놀라게 한 세션이 손실된다는 사실을 깨닫지 못했습니다.
같은 생각을하는 분들을 위해 : 재부팅 후 tmux 세션 복원 . 게시물 요약 : 쉘 스크립트를 사용하여 tmux 세션을 빌드하거나 멋진 쉘 히스토리 추적기를 작성하십시오 .
열려있는 세션이 없으면 실제로이 오류가 발생합니다. 열려있는 세션이 없으면 실행중인 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 내에서 세션간에 전환 할 수도 있습니다 . 이것이 제가 보통하는 일입니다.
This happened to me when the Ubuntu desktop crashed and my gnome-terminal windows exited. I could still see the tmux process was running (ps aux | grep tmux
) but for some reason tmux commands would not work to list the existing sessions. Apparently it wasn't finding the existing Unix socket of the still-running tmux process. The fix in this scenario is to locate the existing Unix socket and specify that to tmux using the -S
flag; here's how:
You can find the PID of your still-running tmux process with this:
ps -p $(pidof tmux)
Now take your PID (in my case, 6876) and run this to list any open Unix sockets:
sudo lsof -Uap 6876
Hopefully you see output like this:
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
Now you can specify that existing Unix socket to your tmux command (using the -S
flag), and you should be able to list-sessions and attach properly:
tmux -S /tmp/tmux-1000/default list-sessions
tmux -S /tmp/tmux-1000/default attach -t 0
You may have an error in your .tmux.conf
. I had this problem until i took out this line from my .tmux.conf
:
set-window-option -g xterm-keys on
You could also try tmux -v
and then look at the logs it prints.
One easy fix is to delete the tmp files left by the tmux server, for example, by doing $ rm -rf /tmp/tmux-xxx/
.
The way TMUX(1)
works is by having a client process (tmux
) connect to a server process (tmux
too, but not attached to a TTY), as shown in the following ps
output:
PID TTY STAT TIME COMMAND
19229 pts/1 S+ 0:00 tmux
19231 ? Ss 0:00 tmux
That shows that the client actually starts before the server (one could assume it forks it).
After detach/re-attach, the same ps
command outputs:
PID TTY STAT TIME COMMAND
19231 ? Ss 0:00 tmux
19290 pts/1 S+ 0:00 tmux attach
This shows the tmux client as tmux attach
, thus being a bit easier to understand.
Now, if we look at the output of pstree
in both of the above cases, we get in both cases (ignoring the pid
change for tmux attach
):
pstree -p
init(1)─┬─acpid(1824)
├─cron(1859)
⋮
├─sh(14146)───tmux(19229)
└─tmux(19231)───sh(19233)───pstree(19234)
Clearly showing that the commands typed (pstree
in this case) in the client process (PID 19229
) get executed by the server one (PID 19231
), thus allowing them to continue without SIGHUP in the event where the client terminal is lost (over ssh, for example).
Now, to the question OP asked: what happens in the case where tmux
returns failed to connect to server: Connection refused
is that the server process (pid 19231 in our case) is unreachable, whatever the reason (it can be because the server process died; but also because the user executing the tmux
client doesn't have the permissions to access the tmux socket, etc.)
The solution in that case is to grep
for the tmux
processes (via ps
for example), and pray that you didn't get this error because the server died (so you can attach to it by using lsof
to get what sockets it listens to). Otherwise, there is no way to attach to the server, as it is as dead as after a reboot.
TL;DR:
This error can be given for multiple reasons, ranging from bug to critical failure (program died). In a nutshell, use the UNIX tools at your disposal to determine what socket does tmux
use, if it is still running (there should be at least two processes if you have the tmux client running - that happens after invoking tmux
or tmux attach
from the shell) and thus if you lost your session or not.
Note: as other answers pointed out, if the reason for this error to be shown is a socket error, you can use the -L
flag to tell tmux
to use a specific socket.
I was using another program inside of tmux (reattach-to-user-namespace), and I was getting this error when I switched computers because reattach-to-user-namespace was not installed. The fix was to simply run brew install reattach-to-user-namespace
.
This may happen if you or any cleaning process delete files in /tmp/*
. All your sessions data are lost if you can't recover those files. Killing all tmux instances and restart it is the only choice left, unfortunately.
'Program Tip' 카테고리의 다른 글
Android : APK가 대상으로하는 플랫폼 버전을 찾는 방법은 무엇입니까? (0) | 2020.12.14 |
---|---|
PHP의 변수에 문자열을 추가 할 수 있습니까? (0) | 2020.12.14 |
Pandas Barplot에서 x 축 눈금 레이블을 회전하는 방법 (0) | 2020.12.14 |
SourceSet 'instrumentTest'는 Android Gradle 플러그인에서 인식되지 않습니다. (0) | 2020.12.14 |
Haskell에서 빈 목록을 확인하기 위해 == [] 대신 null 함수를 사용하는 이유는 무엇입니까? (0) | 2020.12.14 |