2012-01-27 43 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