2012-01-27 18 views
20

Recientemente cambié de usar screen a tmux (obtenido a través de macports), ya que me gusta más la función establecida. Sin embargo, parece que no puedo hacer que tmux se vuelva a conectar desde una ubicación alternativa, como lo hago con la pantalla.tmux no se vuelve a conectar

En casa en mi Mac, abriré iTerm2, mi shell predeterminado es zsh, y comenzaré una sesión de tmux con tmux. Preparo todos mis spits, me meto en los servidores adecuados, etc., y trabajo por un tiempo. Hora de ir a trabajar. <C-a> d - tmux se separa.

Me pongo a trabajar, donde uso una máquina de Windows XP. Me fuego hasta masilla, ssh en mi mac de vuelta en casa, intentar una tmux attach, y aparece un mensaje de error:

no sessions

Me parece que no puede determinar por qué esto iba a pasar. No tengo miedo de profundizar en esto, pero ni siquiera sé por dónde empezar. ¿Pensamientos?

P.S. Ya he eliminado mi archivo .tmux.conf, por lo que está usando la configuración predeterminada.

Respuesta

19

tmux almacena su socket de servidor en un directorio bajo el directorio especificado por la variable de entorno TMPDIR.

En la sesión de su GUI probablemente termine con un TMPDIR que apunta a algún lugar debajo de /var (por ejemplo, /var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/).

Cuando se accede a través de SSH, es probable que terminan sin un conjunto TMPDIR, por lo tmux mira debajo /tmp/ de su zócalo.

En un sistema 10.6, aquí está mi TMPDIR con zsh/& # xfeff; Terminal y con zsh/SSH:

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

Si conoce el valor que necesita utilizar para TMPDIR, puede especificar que cuando se fija (o ejecutar algún otro comando tmux fuera de la sesión en sí):

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

Si usted no sabe el directorio de la sesión de interfaz gráfica de usuario estaba usando usted podría ser capaz de encontrarlo con algo como esto (la sintaxis es específica para zsh, sino que searche s bajo /var/folders/ para un directorio llamado -Tmp- que es propiedad del usuario actual):

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

Para evitar problemas en el futuro, es posible que desee TMPDIR desactivada antes de iniciar su servidor (o se establece en algo que pueda más fácil de predecir).

+6

Ejecutar un 'TMPDIR' unset antes de iniciar mi sesión de tmux resolvió el problema. Enormes apoyos. – kenny

+2

Si está tratando de encontrar el tmpdir en bash, intente 'find/var/folders -type d -name" -Tmp- "-user $ (whoami) 2>/dev/null' Esto se ve en/var/folders para un directorio (d) con el nombre "-Tmp-" propiedad de usted. Dado que/var/folders contendrá una gran cantidad de directorios a los que se les negará el permiso, el stderr también se redirige al segmento de bits. Editar: prematuro introducir – myeeshen

+0

'TMPDIR =/var/carpetas/mV/mVip4IQ4EXOriTiLJmeSuk +++ Tc/-Tmp-/tmux attach' no funcionó para mí, pero' TMUX_TMPDIR =/var/carpetas/mV/mVip4IQ4EXOriTiLJmeSuk ++ + Tc/-Tmp-/tmux attach' con un valor válido para mi TMPDIR encontrado con el comando lsof a continuación. – socketwiz

6

La opción de -Ulsof listas de ficheros socket abierto, por lo lsof -U | grep '^tmux' habrá una lista de todas las tomas en su uso por tmux. Si no ha iniciado sesión como el mismo usuario que inició tmux, necesitará usar sudo.

La última columna de cada fila es el nombre del archivo.Los archivos que le interesan comienzan con /.

Las filas que está buscando se verá algo como esto:

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

En mi caso, al parecer, se limpió la carpeta temporal.
This blog post me ayudó a recuperar mi sesión “perdido”:

finalmente conseguí la solución: el envío de la señal de 10 tmux obligado a volver a crear los zócalos. Después de que podía correr tmux de nuevo sin perder mi sesión:

$ killall -10 tmux 
+1

¡Tuve este mismo problema hoy, y encontré el mismo blog! Funciona, pero estaba confundido acerca de * why * works. Resulta que la señal 10 es * una señal * definida por el usuario *, y [tmux dice que "volverá a crear el socket del servidor en SIGUSR1"] (https://github.com/ThomasAdam/tmux/blob/814e40522cb611895e84fc2aaf58d5d0ca9ba348/CHANGES#L552) – DaoWen

+1

Esto funcionó para mí, pero * no * cuando tuve una segunda sesión de tmux abierta: creo que los sockets chocaron, lo que significa que la sesión original no pudo volver a crearlos. – spookypeanut

+0

El ** directorio padre ** no se recrea antes de los sockets, tiene que hacerlo antes de enviar la señal de muerte. – bufh

1

tengo una variación en el lsof sugerencia de que he utilizado con cierto éxito para “recuperar” la variable TMPDIR que puede ayudar a trabajar en torno a una montón de molestias. La ventaja, supongo, es que uno puede ser un poco más exigente con lo que devuelve lsof y es más fácil analizar el valor correcto (en el caso de que no sea posible, en algún momento algunos caracteres atípicos, pero aún válidos, salen).

A, de una sola línea rápida es:

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

uso la siguiente secuencia de comandos (también podría ser una función en ~/.bash_profile u otro lugar apropiado supongo):

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

Cuestiones relacionadas