2012-01-27 8 views
20

Недавно я переключился с экрана на tmux (полученный через macports), поскольку мне больше нравится набор функций. Тем не менее, я не могу заставить tmux повторно подключаться из альтернативного местоположения, например, я могу экранировать.tmux not re-attach

У меня дома на моем mac, я открою iTerm2, моя оболочка по умолчанию - zsh, и я начну сеанс tmux с tmux. Я получаю все свои плюсы, настроенные, ssh'd на соответствующие серверы и т. Д., И работаю некоторое время. Время идти на работу. <C-a> d - tmux отсоединяется.

Я получаю работу, где я использую машину Windows XP. Я вспылить замазку, SSH в мой макинтош назад дома, попытаться tmux attach и получить сообщение об ошибке:

no sessions

Я не могу определить, почему это произошло. Я не боюсь вникать в это, но даже не знаю, с чего начать. Мысли?

P.S. Я уже удалил файл .tmux.conf, поэтому он использует конфигурацию по умолчанию.

ответ

19

tmux хранит свой серверный сокет в каталоге в каталоге, указанном переменной среды TMPDIR.

В вашем сеансе графического интерфейса вы, вероятно, попадаете в TMPDIR, который указывает где-то под /var (например, /var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/).

Когда вы вошли в систему через SSH, вы, вероятно, закончите без набора TMPDIR, поэтому tmux выглядит под /tmp/ для своего сокета.

В системе 10.6 здесь находится мой TMPDIR с zsh/& # xfeff; Терминал и с Zsh/SSH:

% echo local: ${TMPDIR-unset}; ssh localhost 'echo remote: ${TMPDIR-unset}' 
local: /var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/ 
remote: unset 

Если вы знаете значение, которое нужно использовать для TMPDIR, вы можете указать его при установке (или работает какой-либо другой команды tmux вне сессии сама):

TMPDIR=/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/ tmux attach 

Если вы не знаете, каталог графического интерфейса сессии с помощью вы можете быть в состоянии найти что-то вроде этого (синтаксис специфичен для Zsh; это поиск ресурсов s под /var/folders/ для каталога с именем -Tmp-, который принадлежит текущему пользователю):

echo /var/folders/**/*/-Tmp-(U/) 

Чтобы избежать проблем в будущем, вы можете захотеть, чтобы сбросить TMPDIR перед запуском сервера (или установить его на что-то, что вы можете легче прогнозировать).

+6

Выполнение 'unset TMPDIR' до начала сеанса tmux действительно устранило проблему. Огромный реквизит. – kenny

+2

Если вы пытаетесь найти tmpdir в bash, попробуйте 'find/var/folders -type d -name" -Tmp- "-user $ (whoami) 2>/dev/null' Это выглядит/var/folders для каталога (d) с именем «-Tmp-», принадлежащим вам. Поскольку/var/folders будет содержать много каталогов, которые будут разрешены, stderr также перенаправляется в бит-бит. Редактировать: преждевременно введите – myeeshen

+0

'TMPDIR =/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk +++ Tc/-Tmp-/tmux attach' не работает для меня, но' TMUX_TMPDIR =/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk ++ + Tc/-Tmp-/tmux attach' с допустимым значением для моего TMPDIR, найденного с помощью команды lsof ниже. – socketwiz

6

-U вариант lsof списков открыть сокет файлов, так lsof -U | grep '^tmux' будет список всех сокетов, используемых по tmux. Если вы не вошли в систему как тот же пользователь, который запустил tmux, вам нужно будет использовать sudo.

Последний столбец каждой строки - это имя файла.Файлы, о которых вы заботитесь, начинаются с /.

Ряды вы ищете будет выглядеть примерно так:

tmux 1234 username 6u unix 0xffffffabcd123456 0t0 /private/var/folders/M8/M8tFwolmH08fOvJ+-35VI++++TM/-Tmp-/tmux-502/default 
tmux 56789 username 6u unix 0xffffff123456789a 0t0 /private/tmp/tmux-502/default 
31

В моем случае, по-видимому, временная папка была очищена.
This blog post помог мне восстановить мою «потерял» сессию:

я, наконец, получил решение: посылающий сигнал 10 вынужденную tmux воссоздавать сокеты. После этого я мог бежать tmux снова, не теряя свою сессию:

$ killall -10 tmux 
+1

У меня была такая же проблема сегодня, и наткнулся на тот же блог! Это работает, но я был смущен * почему * он работает. Оказывается, что сигнал 10 является * определяемым пользователем сигналом *, а [tmux говорит, что он «воссоздает серверный сокет на SIGUSR1»] (https://github.com/ThomasAdam/tmux/blob/814e40522cb611895e84fc2aaf58d5d0ca9ba348/CHANGES#L552). – DaoWen

+1

Это сработало для меня, но * не *, когда у меня открылась вторая сессия tmux: я думаю, что сокеты столкнулись, означая, что исходный сеанс не смог их воссоздать. – spookypeanut

+0

** родительский каталог ** не воссоздается перед сокетами, вы должны сделать это перед отправкой сигнала kill. – bufh

1

У меня есть вариация на lsof предположение, что я использую с некоторым успехом «восстановить» переменную TMPDIR, которая может помочь работать вокруг куча неприятностей. Преимущество, я полагаю, состоит в том, что можно быть немного более требовательным к тому, что возвращает lsof, и проще разбирать правильное значение (на случайный случай в какой-то момент некоторые атипичные символы, но все же действительны, когда-либо выводятся).

Быстро, один-лайнер:

$ lsof -Fn -d6 -aUc tmux | grep ^n | cut -c2- 
/private/var/folders/_l/f_n8blps05xfnkw6fs3dcn_80000gp/T/tmux-502/default 

Я использую следующий сценарий (также может быть функцией в ~/.bash_profile или другое подходящее место, я полагаю):

#!/bin/bash 

if [[ -z "${TMPDIR}" ]]; then 
    while read line; do 
     case $line in 
     n*) line="${line#n}" 
      export TMPDIR="${line%%/tmux-$(id -u)/*}" 
      ;; 
     esac; 
    done < <(lsof -Fn -d6 -aUc tmux) 
else 
    echo ">> \$TMPDIR already defined: $TMPDIR" 1>&2 
fi 

https://gist.github.com/jps3/769d50a6a7611949473b