2012-01-27 11 views
20

Recentemente ho passato dall'uso dello schermo a tmux (ottenuto tramite macports), poiché mi piace il set di funzionalità in più. Tuttavia, non riesco a convincere tmux a ricollegarsi da una posizione alternativa, come se fosse possibile eseguire lo screening.tmux non riattaccare

A casa sul mio mac, aprirò iTerm2, la mia shell di default è zsh, e inizierò una sessione tmux con tmux. Ottengo tutti i miei spits installati, ssh'd nei server appropriati, ecc., E lavoro per un po '. È ora di andare al lavoro. <C-a> d - tmux si stacca.

Vado al lavoro, dove uso una macchina Windows XP. Apro lo stucco, ssh nel mio Mac torna a casa, tento un tmux attach, e un messaggio di errore:

no sessions

io non riesco a capire perché questo sarebbe accaduto. Non ho paura di indagare su questo, ma non so nemmeno da dove cominciare. Pensieri?

P.S. Ho già rimosso il mio file .tmux.conf, quindi utilizza la configurazione predefinita.

risposta

19

tmux memorizza il socket del server in una directory nella directory specificata dalla variabile di ambiente TMPDIR.

nella sessione GUI probabilmente finisce con un TMPDIR che punta a qualche parte sotto /var (ad esempio /var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/).

Quando si effettua l'accesso tramite SSH, si rischia di finire senza un set TMPDIR, quindi tmux visualizza sotto il numero /tmp/ per il socket.

Su un sistema 10.6, ecco la mia TMPDIR con zsh/& # xfeff; Terminal, e con zsh/SSH:

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

Se si conosce il valore è necessario utilizzare per TMPDIR, è possibile specificare che quando si attacca (o l'esecuzione di un altro comando tmux al di fuori della sessione stesso):

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

Se non si conosce la directory la sessione GUI stava usando potrebbe essere in grado di trovare con qualcosa di simile (la sintassi è specifico per zsh, ma searche s sotto /var/folders/ per una directory denominata -Tmp- che è di proprietà dell'utente corrente):

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

Per evitare problemi in futuro, si potrebbe desiderare di TMPDIR unset prima di avviare il server (o impostarlo su qualcosa che si può più facilmente prevedere).

+6

L'esecuzione di un 'TMPDIR' non impostato prima dell'avvio della sessione tmux ha risolto il problema. Oggetti di scena enormi. – kenny

+2

Se stai cercando di trovare il tmpdir in bash, prova 'trova/var/folders -type d -name" -Tmp- "-user $ (whoami) 2>/dev/null' Questo cerca in/var/cartelle per una directory (d) con nome "-Tmp-" di proprietà dell'utente. Poiché/var/folders conterrà molte directory a cui verrà negata l'autorizzazione, anche lo stderr verrà reindirizzato al bit bucket. Modifica: immissione prematura – myeeshen

+0

'TMPDIR =/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk +++ Tc/-Tmp-/tmux attach' non ha funzionato per me ma' TMUX_TMPDIR =/var/folders/mV/mVip4IQ4EXOriTiLJmeSuk ++ + Tc/-Tmp-/tmux attach' con un valore valido per il mio TMPDIR trovato con il comando lsof di seguito. – socketwiz

6

L'-U possibilità di lsof liste file socket aperto, in modo lsof -U | grep '^tmux' elencherà tutte le prese in uso da tmux. Se non hai effettuato l'accesso come lo stesso utente che ha avviato tmux, sarà necessario utilizzare sudo.

L'ultima colonna di ogni riga è il nome del file.I file che ti interessano iniziano con /.

Le righe che stai cercando sarà simile a questa:

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

Nel mio caso, a quanto pare cartella temporanea è stata pulita.
This blog post mi ha aiutato a recuperare il mio “perso” sessione:

finalmente ho la soluzione: l'invio del segnale di 10 tmux costretti a ricreare prese. Dopo di che ho potuto correre tmux di nuovo senza perdere la mia sessione:

$ killall -10 tmux 
+1

Oggi ho avuto lo stesso problema e ho trovato lo stesso blog! Funziona, ma ero confuso su * perché * funziona. Si scopre che il segnale 10 è un segnale * definito dall'utente * e [tmux dice che "ricreerà il socket del server su SIGUSR1"] (https://github.com/ThomasAdam/tmux/blob/814e40522cb611895e84fc2aaf58d5d0ca9ba348/CHANGES#L552). – DaoWen

+1

Questo ha funzionato per me, ma * non * quando ho avuto una seconda sessione di tmux aperta: penso che le prese si siano scontrate significando che la sessione originale non è stata in grado di ricrearle. – spookypeanut

+0

La ** parent directory ** non viene ricreata prima dei socket, devi farlo prima di inviare il segnale kill. – bufh

1

ho una variazione sul lsof suggestione che ho utilizzato con un certo successo di “recuperare” la variabile TMPDIR che può aiutare a lavorare attorno ad un mucchio di fastidi. Il vantaggio, suppongo, è che uno può essere un po 'più esigente su ciò che restituisce lsof e più facile da analizzare il valore corretto (a volte in qualche punto dei caratteri atipici, ma ancora valido, sempre in uscita).

Un rapido, one-liner è:

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

Io uso il seguente script (potrebbe anche essere una funzione in ~/.bash_profile o altro luogo adatto suppongo):

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

Problemi correlati