Почему я получаю сообщение «Не удалось подключиться к серверу» от tmux, когда пытаюсь составить список сеансов? - PullRequest
56 голосов
/ 12 марта 2012

Вот что со мной происходит: я запускаю сеансы 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 работает?

Ответы [ 10 ]

53 голосов
/ 02 января 2017

TL; DR: Попробуйте отправить сигнал SIGUSR1 процессу tmux-сервера.

В моем случае после примерно 8 дней бездействия я не смог подключить:

$ tmux attach
no sessions

Однако процесс grep для tmux дал мне такой вывод:

$ 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 ошибку.Я проверил, что каталог tmp, принадлежавший сеансу tmux, существует и lsof -p 7139 (pid сервера tmux) показал, что файл сокета открыт:

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, что отправка SIGUSR1 заставит tmux воссоздать файл сокета, поэтому я попытался это сделать, и я смог сразу найти сессию и снова подключиться:

$ kill -s USR1 7139
$ tmux ls
0: 12 windows (created Mon Apr 18 21:17:55 2016) [198x62]
32 голосов
/ 19 мая 2013

Это происходит со мной, когда у меня нет запущенных сессий.Я только начинаю использовать tmux и не осознаю, что если вы перезагрузите компьютер, вы потеряете сессии, которые меня сначала удивили.

Для тех из вас, кто думает о том же:Сессия tmux после перезагрузки .Краткое содержание сообщения: используйте сценарии оболочки для создания сеансов tmux или создайте необычный трекер истории оболочки .

14 голосов
/ 11 января 2016

Это случилось со мной, когда рабочий стол Ubuntu рухнул, и мои окна gnome-терминала закрылись.Я все еще мог видеть, что процесс tmux запущен (ps aux | grep tmux), но по какой-то причине команды tmux не работают для вывода списка существующих сеансов.По-видимому, он не нашел существующий сокет Unix все еще работающего процесса tmux.Исправление в этом сценарии состоит в том, чтобы найти существующий сокет Unix и указать его для tmux, используя флаг -S;вот как:

Вы можете найти PID вашего все еще работающего процесса tmux с помощью:

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
14 голосов
/ 22 сентября 2014

Вы действительно получите эту ошибку, если нет открытых сеансов.Если открытых сеансов нет, сервер 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 отсоединит его от предыдущего клиента (если он подключен)

Вы также можете переключаться между сеансами внутри tmux с помощью команды choose-tree, которая по умолчанию назначается нажатию клавиши C-s (префиксная клавиша + s).Это то, что я обычно делаю.

9 голосов
/ 17 марта 2013

У вас может быть ошибка в .tmux.conf. У меня была эта проблема, пока я не вынул эту строку из моего .tmux.conf:

set-window-option -g xterm-keys on

Вы также можете попробовать tmux -v и посмотреть журналы, которые он печатает.

6 голосов
/ 12 января 2015

Одно простое решение - удалить файлы tmp, оставленные сервером tmux, например, выполнив $ rm -rf /tmp/tmux-xxx/.

3 голосов
/ 10 февраля 2016

Это может произойти, если вы или любой другой процесс очистки удалите файлы в /tmp/*. Все ваши данные сессий будут потеряны, если вы не сможете восстановить эти файлы. Убить все экземпляры tmux и перезапустить его, к сожалению, остается единственным выбором.

3 голосов
/ 13 мая 2015

Способ 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).


Теперь к вопросу ОП задали: что происходит в случае, когда tmux возвращает failed to connect to server: Connection refused заключается в том, что процесс сервера (pid 19231 в нашем случае) недоступен, независимо от причины (это может быть потому, что процесс сервера умер;но также потому, что пользователь, выполняющий клиент tmux, не имеет прав доступа к сокету tmux и т. д.)

Решение в этом случае заключается в grep для процессов tmux (черезps, например), и молитесь, чтобы вы не получили эту ошибку, потому что сервер умер (поэтому вы можете подключиться к нему с помощью lsof, чтобы узнать, какие сокеты он слушает).В противном случае невозможно присоединить к серверу, так как он не работает как после перезагрузки.


TL; DR:

Эта ошибка можетдавать по нескольким причинам, начиная от ошибки до критической ошибки (программа умерла).В двух словах, используйте имеющиеся в вашем распоряжении инструменты UNIX, чтобы определить, какой сокет использует tmux, если он все еще работает (если у вас запущен клиент tmux, должно быть как минимум два процесса - это происходит после вызова tmux илиtmux attach из оболочки) и, таким образом, если вы потеряли сеанс или нет.

Примечание: как указывалось в других ответах, если причиной этой ошибки является ошибка сокета, вы можетеиспользуйте флаг -L, чтобы указать tmux использовать определенный сокет.

3 голосов
/ 11 июня 2014

Я использовал другую программу внутри tmux (reattach-to-user-namespace), и я получал эту ошибку, когда переключал компьютеры, потому что reattach-to-user-namespace не было установлено. Исправление должно было просто запустить brew install reattach-to-user-namespace.

0 голосов
/ 12 марта 2012

Попробуйте tmux -L name1 list-session.

...