Почему я получаю сообщение об ошибке подключения к серверу от 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 работает?


person thinke365    schedule 12.03.2012    source источник


Ответы (10)


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

person Lars Kotthoff    schedule 12.03.2012
comment
Эта команда будет отображать только сеанс name1, а не name2. См. мой ответ для получения списка нескольких сеансов. - person gitaarik; 22.09.2014
comment
Первое слово вопроса — Почему. Этот ответ даже не пытается доставить. Плюс эта команда на самом деле не удалась в моем случае (однако tmux -L list-session волшебным образом сработало - теперь мне нужно копаться в себе, чтобы узнать, почему, почему не первое, как и т. Д. Так что в основном я должен ответить на вопрос ОП для себя). - person 7heo.tk; 13.05.2015
comment
@whyisyoung К сожалению, SO не позволяет отменить голосование за комментарии через несколько минут. Но ваш комментарий вводит в заблуждение. Что вы делаете с tmux -L list-session, так это ЗАПУСК НОВОГО экземпляра tmux с сокетом с именем list-session. Это вводит в заблуждение, поскольку команда гласит: используйте tmux для вывода списка сеансов с установленным флагом -L. Вы должны удалить этот комментарий (поскольку вы больше не можете редактировать), учитывая, насколько он вреден. - person 7heo.tk; 13.05.2015
comment
@7heo.tk Извините, я не могу вспомнить, что тогда произошло. Затем я попробовал команду tmux -L list-session, она действительно запускает новый экземпляр, а не сеанс. Спасибо за ваш комментарий. - person whyisyoung; 14.05.2015
comment
@whyisyoung спасибо за уборку; здорово видеть, что содержание SO улучшается с течением времени. (Не связано: для людей, которые читают комментарии выше; я ответил на вопрос OP для всех (не только для себя) здесь) - person 7heo.tk; 15.05.2015

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]
person haridsv    schedule 02.01.2017
comment
Это единственное, что сработало для меня. Я сделал глупость, выполнив rm -rf tmp/*, которая удалила файл сокета tmux. Я обязательно запомню этот трюк. - person Sudo Bash; 15.02.2017
comment
Это также решило мою проблему: я изменил идиотскую настройку по умолчанию $TMP, что означало, что сокет tmux находился не в том месте. - person user2475529; 21.06.2017
comment
Спасибо за ваш ответ, это решило проблему и для меня. Не могли бы вы уточнить, что здесь происходит и почему это исправление необходимо? - person Harpe; 26.09.2017
comment
@Harpe Я не знаю, возможно, ошибка tmux, которую нелегко воспроизвести. - person haridsv; 27.09.2017
comment
проще сделать это сразу одной строкой: pkill -USR1 -xf tmux (по крайней мере, если вы запустили сервер tmux с его простой командой tmux). - person DJCrashdummy; 05.08.2019
comment
или, возможно, pkill -USR1 -o tmux также должен работать, и даже если вы не использовали простую команду tmux для запуска своего сервера. - person DJCrashdummy; 05.08.2019
comment
Это единственное, что сработало!! Большое спасибо @haridsv - person Avtar Sohi; 07.08.2020

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

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

person Nathan    schedule 19.05.2013
comment
К вашему сведению: сеансы tmux не сохраняются после перезагрузки, потому что это просто фоновые процессы, которые завершаются при выключении компьютера. - person Nathan; 19.05.2013
comment
не совсем точный ответ, потому что ОП ничего не сказал о перезагрузке, но, тем не менее, хорошая ссылка на хороший вопрос с полезными идеями и ссылками. - person DJCrashdummy; 02.08.2019
comment
Я упомянул перезагрузку @DJCrashdummy, потому что именно так я столкнулся с проблемой. Может быть, ОП перезагрузился, а может, и нет. Ответы на SO не обязательно должны быть точными. Надежда состоит в том, чтобы быть полезным для большего сообщества. - person Nathan; 06.08.2019

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

person gitaarik    schedule 22.09.2014

Это случилось со мной, когда произошел сбой рабочего стола 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
person Abe Voelker    schedule 11.01.2016

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

set-window-option -g xterm-keys on

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

person Rose Perrone    schedule 17.03.2013
comment
Где он печатает журналы? это должен быть консольный вывод? - person AlexLordThorsen; 27.02.2016

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

person Shumin Guo    schedule 12.01.2015
comment
Спасибо, это было решением для меня. Следующий шаг — просто создать новую сессию с tmux new -s $session_name и все. - person Carlos A. Ortiz; 19.08.2017

Способ работы 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 использовать определенный сокет.

person 7heo.tk    schedule 13.05.2015

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

person akofink    schedule 11.06.2014

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

person Pierre Maoui    schedule 10.02.2016