2012-01-27 48 views
20

我最近从使用屏幕切换到tmux(通过macports获得),因为我喜欢功能集更多。但是,我似乎无法让tmux从其他位置重新连接,就像我可以屏幕一样。tmux不重新附加

在我家的Mac上,我会打开iTerm2,我的默认shell是zsh,我将开始与tmux的tmux会话。我把所有的唾液都设置好了,装进适当的服务器等等,然后工作一段时间。上班时间。 <C-a> d - tmux分离。

我开始工作,在那里我使用的Windows XP机。我火了腻子,ssh进入我的Mac回到家里,尝试tmux attach,并得到一个错误信息:

no sessions

我似乎无法确定为什么会发生这种事。我不害怕深入研究,但甚至不知道从哪里开始。思考?

P.S.我已经删除了我的.tmux.conf文件,因此它使用了默认配置。

回答

19

tmux将其服务器套接字存储在由TMPDIR环境变量指定的目录下的目录中。

在您的GUI会话中,您可能会得到指向/var(例如/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/)下某处的TMPDIR。

当您通过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 

如果你不知道你的GUI会话使用你也许可以像这样的东西找到它(语法是特定于的zsh的目录,它搜索器小号/var/folders/下名为-Tmp-目录由当前用户拥有):

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

为了避免在将来出现问题,你可能想取消设置TMPDIR启动服务器之前(或将其设置为东西,你可以更容易预测)。

+6

在开始我的tmux会话之前运行“未设置TMPDIR”确实解决了问题。巨大的道具。 – kenny 2012-01-30 18:53:58

+2

如果您尝试在bash中找到tmpdir,请尝试使用 这个外观//var/folders/(d)名称为“-Tmp-”的var/folders属于您。由于/ var /文件夹将包含许多将被拒绝权限的目录,因此stderr也会重定向到位桶。 编辑:提前输入 – myeeshen 2012-04-10 21:50:27

+0

'TMPDIR =/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk +++ Tc/-Tmp-/tmux attach'不适用于我,但是TMUX_TMPDIR =/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk ++ + Tc/-Tmp-/tmux attach',为我的TMPDIR发送一个有效值,用下面的lsof命令。 – socketwiz 2016-10-04 20:28:52

6

lsof列出开放套接字文件的-U选项,所以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 2015-01-19 19:44:18

+1

这对我有用,但* *不*当我有第二个tmux会话打开:我认为套接字冲突意味着原来的会话无法重新创建它们。 – spookypeanut 2015-05-21 05:58:50

+0

**父目录**不会在套接字之前重新创建,您必须在发送kill信号之前执行此操作。 – bufh 2016-01-26 12:04:28

1

我有我一直在使用了一些成功“恢复”的TMPDIR变量,它可以帮助周围工作的lsof建议的变化一堆烦恼。我认为,好处在于,对于什么样的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