25

我最近从使用 screen 切换到 tmux(通过 macports 获得),因为我更喜欢该功能集。但是,我似乎无法让 tmux 从另一个位置重新连接,就像我可以筛选一样。

在家里我的 mac 上,我会打开 iTerm2,我的默认 shell 是 zsh,我会开始一个 tmux 会话tmux。我设置了所有的口水,通过 ssh 连接到适当的服务器等,然后工作了一段时间。是时候去上班了。<C-a> d- tmux 分离。

我开始工作,在那里我使用 Windows xp 机器。我启动 putty,在家中通过 ssh 连接到我的 mac,尝试 a tmux attach,并收到一条错误消息:

no sessions

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

PS 我已经删除了我的 .tmux.conf 文件,所以它使用默认配置。

4

4 回答 4

43

就我而言,显然临时文件夹已被清理。
这篇博文帮助我恢复了“丢失”的会话:

我终于得到了解决方案:发送信号 10 强制 tmux 重新创建套接字。之后我可以再次运行 tmux 而不会丢失我的会话:

$ killall -10 tmux
于 2014-03-31T09:53:50.133 回答
23

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

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

当您通过 SSH 登录时,您可能最终没有设置 TMPDIR,因此tmux在下面/tmp/查找它的套接字。

在 10.6 系统上,这是我的带有zsh /Terminalzsh /SSH 的 TMPDIR:

% 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(或将其设置为您更容易预测的值)。

于 2012-01-28T13:53:48.840 回答
7

列出打开的套接字文件的-U选项,因此将列出tmux正在使用的所有套接字。如果您没有以启动tmux的同一用户身份登录,则需要使用.lsoflsof -U | grep '^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
于 2012-10-04T16:15:25.060 回答
2

我对我一直在使用并成功“恢复” 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

于 2015-08-29T18:31:41.410 回答