Question

I recently switched from using screen to tmux (obtained through macports), as I like the feature set more. However, I can't seem to get tmux to reattach from an alternate location, like I can screen.

At home on my mac, I will open up iTerm2, my default shell is zsh, and I will begin a tmux session with tmux. I get all my spits set up, ssh'd into the proper servers, etc., and work for a while. Time to go to work. <C-a> d - tmux detaches.

I get to work, where I use a windows xp machine. I fire up putty, ssh into my mac back at home, attempt a tmux attach, and get an error message:

no sessions

I cannot seem to determine why this would happen. I am not afraid to dig into this, but don't even know where to start. Thoughts?

P.S. I have already removed my .tmux.conf file, so it's using the default config.

Was it helpful?

Solution

tmux stores its server socket in a directory under the directory specified by the TMPDIR environment variable.

In your GUI session you probably end up with a TMPDIR that points to somewhere under /var (e.g. /var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/).

When you are logged in through SSH, you probably end up without a TMPDIR set, so tmux looks under /tmp/ for its socket.

On a 10.6 system, here is my TMPDIR with zsh/Terminal, and with zsh/SSH:

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

If you know the value you need to use for TMPDIR, you can specify it when attaching (or running some other tmux command outside of the session itself):

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

If you do not know the directory your GUI session was using you might be able to find it with something like this (the syntax is specific to zsh; it searches under /var/folders/ for a directory named -Tmp- that is owned by the current user):

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

To avoid problems in the future, you might want to unset TMPDIR before starting your server (or set it to something that you can more easily predict).

OTHER TIPS

In my case, apparently temp folder was cleaned.
This blog post helped me recover my “lost” session:

I finally got the solution: sending the signal 10 forced tmux to recreate sockets. After that I could run tmux again without losing my session:

$ killall -10 tmux

The -U option of lsof lists open socket files, so lsof -U | grep '^tmux' will list all of the sockets in use by tmux. If you're not logged in as the same user that started tmux, you will need to use sudo.

The last column of each row is the name of the file. The files you care about start with a /.

The rows you're looking for will look something like this:

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

I have a variation on the lsof suggestion that I have been using with some success to “recover” the TMPDIR variable which can help working around a bunch of annoyances. The advantage, I suppose, is that one can be a little more exacting about what lsof returns and easier to parse out the correct value (on the off-chance at some point some atypical chars, but still valid, ever output).

A quick, one-liner is:

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

I use the following script (could also be a function in ~/.bash_profile or other appropriate place I suppose):

#!/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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top