Khôi phục phiên tmux sau khi khởi động lại


255

Có cách nào để lưu một phiên tmux không? Nói cách khác, nếu tôi khởi động lại máy tính, tôi sẽ luôn bị mất các phiên?


1
Bạn có thể ngủ đông vào đĩa thay thế
Mâtt Frëëman

36
Ngủ đông là một cách thay thế để máy tính của bạn chạy liên tục, không khởi động lại.
chepner

5
@chepner: Có những ngày khi*** System restart required ***
karatedog

2
@karatedog Có, vì vậy cả hai chúng tôi đều đồng ý rằng ngủ đông không phải là giải pháp để mất phiên tmux của bạn khi khởi động lại.
chepner

Câu trả lời:


170

Có, nếu bạn khởi động lại máy tính, bạn sẽ mất các phiên. Phiên không thể được lưu. Nhưng, họ có thể được viết kịch bản. Những gì hầu hết làm trong thực tế là kịch bản một số phiên để bạn có thể tạo lại chúng. Chẳng hạn, đây là một tập lệnh shell tầm thường để tạo một phiên:

#!/bin/zsh                                                                                                   

SESSIONNAME="script"
tmux has-session -t $SESSIONNAME &> /dev/null

if [ $? != 0 ] 
 then
    tmux new-session -s $SESSIONNAME -n script -d
    tmux send-keys -t $SESSIONNAME "~/bin/script" C-m 
fi

tmux attach -t $SESSIONNAME

Đây là những gì nó làm. Đầu tiên, nó kiểm tra xem đã có phiên nào có tên đó chưa (trong trường hợp này, tên ban đầu là "script") với phiên có tmux . Nó kiểm tra mã trả lại. Nếu đã có một phiên liên tục với tên đó, nó sẽ bỏ qua chu trình "nếu" và đi thẳng đến dòng cuối cùng, nơi nó gắn vào phiên. Mặt khác, nó tạo một phiên và gửi một số khóa cho nó (bây giờ chỉ chạy một tập lệnh ngẫu nhiên). Sau đó, nó thoát khỏi khối "nếu" và đính kèm.

Đây là một mẫu rất tầm thường. Bạn có thể tạo nhiều cửa sổ, tấm và tương tự trước khi đính kèm.

Điều này sẽ không giống với những gì bạn yêu cầu, mặc dù. Nếu bạn thực hiện bất kỳ thay đổi nào đối với phiên, chẳng hạn, bạn đổi tên một cửa sổ và tạo một cửa sổ mới trong đó, nếu bạn khởi động lại những thay đổi đó tất nhiên sẽ không được lưu.

Có một số công cụ giúp dễ dàng xử lý các phiên kịch bản, mặc dù tôi thích làm thủ công hơn (tôi nghĩ nó linh hoạt hơn). Những công cụ đó là TmuxinatorTeamocil .

Nguồn thông tin chính của tôi là cuốn sách "Cuốn sách thực dụng" Tmux.


1
không có vẻ như điều đó sẽ làm bất cứ điều gì nếu tôi muốn khôi phục một phiên với 5 tệp được mở. Không có cách nào để làm điều đó?
chovy

4
Tmux không biết gì về trạng thái của các quy trình bạn có thể đã chạy. Bạn có thể mở tập lệnh có cùng tệp bằng cách sử dụng lệnh 'khóa gửi' hoặc 'cửa sổ tách' là 'vim file1 file2 file3' hoặc xem xét quản lý phiên của biên tập viên của bạn (vim -S và tương tự)
bloy

Mục đích của tmux send-keys ...dòng là gì?
Dominykas Mostauskis

2
@DominykasMostauskis lệnh đó sẽ nhấn các phím bấm vào phiên được chỉ định. Nó giống như nhập phiên và nhập chính những phím đó từ bàn phím. Trong trường hợp này, bạn gửi "~ / bin / script" theo sau là Enter.
Dakatine

1
sự kết hợp some command; if [ $? != 0 ]; then .....dễ viết hơn (và dễ đọc) như : if ! some command; then ......
fonini

117

Tôi đã viết một tập lệnh bash đơn giản , vẫn tồn tại các phiên tmux, cửa sổ và các thư mục làm việc hiện tại trong mỗi tập.

Gọi nó như vậy theo cách thủ công hoặc định kỳ từ cron (vì bạn có thể quên):

tmux-session save

Nó sẽ viết cho ~/.tmux-session. Khôi phục chúng sau khi khởi động lại như vậy:

tmux-session restore

Tôi thấy điều này tốt hơn nhiều so với một kịch bản Perl dài vài trăm dòng.


Đây chỉ là nếu bạn có một phiên tmux?
Thứ bảy

86

Tôi đã viết một plugin tmux cho phép bạn lưu môi trường tmux hoàn chỉnh và khôi phục nó sau. Nó cố gắng để thực sự chi tiết để bạn có cảm giác bạn không bao giờ thoát khỏi tmux.

https://github.com/tmux-plugins/tmux-resurrect

Cập nhật: hiện có plugin tmux-continuum thực hiện lưu nền tự động của môi trường tmux. Tùy chọn nó cũng * tự động * khôi phục tmux env sau khi khởi động lại máy tính.


Ngay khi tôi đăng "câu trả lời" của mình với cùng một liên kết tôi đã tra cứu - "do'h!" Tìm thấy điều này trong khi cố gắng nhớ những gì plugin của bạn được gọi.
phatskat

Plugin này không tệ, nhưng nó không khôi phục tất cả các chương trình của tôi. Sẽ đọc thêm tài liệu của bạn và có thể gửi một vấn đề trên github.
Arne

@Arne Tùy thuộc vào chương trình, điều này có thể yêu cầu điểm kiểm tra chương trình. Thay vào đó, tôi khuyên bạn nên định cấu hình các chương trình của mình để khôi phục - các tệp .vimrc và vị trí con trỏ liên tục cho vim, v.v. - và lưu trữ tmux pane_cản_command cho các chương trình như con người có thể được mở lại. Theo quan điểm của tôi là rất phức tạp, nhưng đáng để xem xét trong mọi trường hợp.
John P

@ bruno-snom có ​​gì khác biệt giữa plugin của bạn (tmux-resurrect) và tmux-coninuum?
lony

Hiện nay tôi cần thiết để vá liên tục như thế này để làm cho nó hoạt github.com/tmux-plugins/tmux-continuum/blob/master/docs/...
rofrol

10

tmuxinator là một công cụ được viết bằng Ruby, có thể được sử dụng để tạo và quản lý các phiên tmux một cách dễ dàng. Nó có thể được sử dụng để tạo một dự án, sau này có thể được khởi tạo dưới dạng phiên tmux.


5

Hãy xem xét giải pháp một phần này được tìm thấy ở đây

Tác giả tạo ra một chức năng lưu lịch sử của phiên tmux để duy trì trạng thái của phiên tmux sau khi khởi động lại máy chủ.


17
Bạn có thể vui lòng gửi những gì họ nói? Liên kết có thể thối rữa.
cpast

1
@cpast: Điều này đúng, nhưng ý kiến ​​cũng có thể bị thối. Tốt nhất để tặng cả hai :)
danielpops

6
@greg Liên kết của bạn trả về 404
rofrol

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.