2012-01-27 13 views
20

Gần đây tôi đã chuyển từ sử dụng màn hình sang tmux (thu được thông qua macports), vì tôi thích tính năng được đặt nhiều hơn. Tuy nhiên, tôi không thể có được tmux để gắn lại từ một vị trí thay thế, như tôi có thể sàng lọc.tmux không đính kèm lại

Ở nhà trên máy Mac của tôi, tôi sẽ mở iTerm2, vỏ mặc định của tôi là zsh và tôi sẽ bắt đầu phiên tmux với tmux. Tôi nhận được tất cả các spits của tôi thiết lập, ssh'd vào các máy chủ thích hợp, vv, và làm việc trong một thời gian. Thời gian để đi làm. <C-a> d - tmux detaches.

Tôi bắt đầu làm việc, nơi tôi sử dụng máy tính Windows xp. Tôi cháy lên putty, ssh vào mac của tôi trở lại ở nhà, cố gắng một tmux attach, và nhận được một thông báo lỗi:

no sessions

tôi dường như không thể xác định tại sao điều này sẽ xảy ra. Tôi không ngại đào sâu vào điều này, nhưng thậm chí không biết bắt đầu từ đâu. Suy nghĩ?

P.S. Tôi đã gỡ bỏ tập tin .tmux.conf, vì vậy nó sử dụng cấu hình mặc định.

Trả lời

19

tmux lưu trữ ổ cắm máy chủ trong thư mục trong thư mục được chỉ định bởi biến môi trường TMPDIR.

Trong phiên giao diện GUI của bạn, bạn có thể kết thúc bằng TMPDIR trỏ đến một nơi nào đó theo số /var (ví dụ: /var/folders/mV/mVip4IQ4EXOriTiLJmeSuk+++Tc/-Tmp-/).

Khi bạn đăng nhập thông qua SSH, bạn có thể kết thúc mà không có bộ TMPDIR, vì vậy tmux trông dưới /tmp/ cho ổ cắm của nó.

Trên hệ thống 10.6, đây là TMPDIR của tôi với zsh/& # xfeff; ga, và với zsh/SSH:

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

Nếu bạn biết giá trị mà bạn cần phải sử dụng cho TMPDIR, bạn có thể xác định nó khi gắn (hoặc chạy một số khác lệnh tmux bên ngoài phiên chính nó):

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

Nếu bạn không biết thư mục phiên GUI của bạn đang sử dụng bạn có thể tìm thấy nó với một cái gì đó như thế này (cú pháp là cụ thể cho zsh; nó searche s dưới /var/folders/ cho một thư mục có tên -Tmp- được sở hữu bởi người dùng hiện hành):

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

Để tránh các vấn đề trong tương lai, bạn có thể muốn TMPDIR unset trước khi bắt đầu máy chủ của bạn (hoặc đặt nó vào một cái gì đó mà bạn có thể dễ dự đoán hơn).

+6

Chạy 'unset TMPDIR' trước khi bắt đầu phiên tmux của tôi đã giải quyết được sự cố. Đạo cụ lớn. – kenny

+2

Nếu bạn đang cố gắng tìm tmpdir trong bash, hãy thử 'tìm/var/folders -type d -name" -Tmp- "-user $ (whoami) 2>/dev/null' Cái này trông/var/thư mục cho một thư mục (d) có tên "-Tmp-" do bạn sở hữu. Vì/var/folders sẽ chứa rất nhiều thư mục sẽ bị từ chối, stderr cũng được chuyển hướng đến nhóm bit. Edit: non nhập – myeeshen

+0

'TMPDIR =/var/thư mục/mV/mVip4IQ4EXOriTiLJmeSuk +++ Tc/-Tmp-/tmux attach' không làm việc cho tôi nhưng' TMUX_TMPDIR =/var/thư mục/mV/mVip4IQ4EXOriTiLJmeSuk ++ + Tc/-Tmp-/tmux đính kèm' với giá trị hợp lệ cho TMPDIR của tôi được tìm thấy với lệnh lsof bên dưới. – socketwiz

6

Các -U tùy chọn lsof danh sách các file ổ cắm mở, vì vậy lsof -U | grep '^tmux' sẽ liệt kê tất cả các ổ cắm được sử dụng bởi tmux. Nếu bạn chưa đăng nhập với tư cách là người dùng đã bắt đầu tmux, bạn sẽ cần sử dụng sudo.

Cột cuối cùng của mỗi hàng là tên của tệp.Các tệp bạn quan tâm bắt đầu bằng một số /.

Các hàng bạn đang tìm kiếm sẽ giống như thế này:

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

Trong trường hợp của tôi, rõ ràng là thư mục tạm thời đã được làm sạch.
This blog post đã giúp tôi hồi phục của tôi “mất” phiên:

cuối cùng tôi đã có những giải pháp: gửi các tín hiệu 10 buộc tmux để tái tạo ổ cắm. Sau đó tôi có thể chạy tmux một lần nữa mà không làm mất phiên của tôi:

$ killall -10 tmux 
+1

Tôi đã có cùng một vấn đề này ngay hôm nay và đã bắt gặp cùng một blog! Nó hoạt động, nhưng tôi đã nhầm lẫn về * tại sao * nó hoạt động. Nó chỉ ra rằng tín hiệu 10 là một * tín hiệu do người dùng định nghĩa *, và [tmux nói rằng nó sẽ "tạo lại socket máy chủ trên SIGUSR1"] (https://github.com/ThomasAdam/tmux/blob/814e40522cb611895e84fc2aaf58d5d0ca9ba348/CHANGES#L552). – DaoWen

+1

Điều này làm việc cho tôi, nhưng * không * khi tôi có một phiên tmux thứ hai mở: Tôi nghĩ rằng các ổ cắm đụng độ có nghĩa là phiên ban đầu không thể tái tạo chúng. – spookypeanut

+0

** Thư mục mẹ ** không được tạo lại trước ổ cắm, bạn phải thực hiện trước khi gửi tín hiệu giết. – bufh

1

Tôi có một sự thay đổi trên lsof gợi ý rằng tôi đã được sử dụng với một số thành công để “phục hồi” biến TMPDIR mà có thể giúp làm việc xung quanh một loạt phiền toái. Lợi thế, tôi cho rằng, có thể là một chút chính xác hơn về những gì lsof trả về và dễ dàng hơn để phân tích giá trị chính xác (trên cơ hội tại một số điểm một số ký tự không điển hình, nhưng vẫn hợp lệ, bao giờ đầu ra).

Một cách nhanh chóng, một lót là:

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

tôi sử dụng đoạn mã sau (cũng có thể là một hàm trong ~/.bash_profile hoặc nơi thích hợp khác mà tôi giả sử):

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