Pulihkan sesi tmux setelah reboot

255

Apakah ada cara untuk menyimpan sesi tmux? Dengan kata lain, jika saya me-reboot komputer, apakah saya akan selalu kehilangan sesi?

KendallB
sumber
1
Anda dapat hibernasi ke disk sebagai alternatif
Mâtt Frëëman
36
Hibernasi adalah alternatif untuk membiarkan komputer Anda terus berjalan, bukan me-reboot.
chepner
5
@ chepner: Ada hari-hari ketika*** System restart required ***
karatedog
2
@karatedog Ya, jadi kami berdua sepakat bahwa hibernasi bukan solusi untuk kehilangan sesi tmux Anda saat reboot.
chepner

Jawaban:

170

Ya, jika Anda me-reboot komputer Anda, Anda akan kehilangan sesi. Sesi tidak dapat disimpan. Tapi, mereka bisa dituliskan. Yang paling banyak dilakukan sebenarnya adalah membuat skrip beberapa sesi sehingga Anda dapat membuatnya kembali. Misalnya, berikut ini skrip shell sepele untuk membuat sesi:

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

Inilah yang dilakukannya. Pertama, ia memeriksa apakah sudah ada sesi dengan nama itu (dalam hal ini, nama asli adalah "skrip") dengan tmux memiliki sesi . Itu memeriksa kode kembali. Jika sudah ada sesi yang sedang berlangsung dengan nama itu, ia akan melewatkan siklus "jika" dan langsung ke baris terakhir, di mana ia melekat pada sesi. Kalau tidak, itu membuat sesi dan mengirim beberapa kunci untuk itu (hanya menjalankan skrip acak untuk saat ini). Kemudian keluar dari blok "jika" dan menempel.

Ini adalah sampel yang sangat sepele. Anda dapat membuat banyak jendela, panel, dan sejenisnya sebelum Anda lampirkan.

Ini tidak akan menjadi hal yang sama seperti yang Anda minta. Jika Anda melakukan perubahan pada sesi, misalnya Anda mengubah nama jendela dan membuat panel baru di dalamnya, jika Anda me-reboot perubahan itu tentu saja tidak akan disimpan.

Ada beberapa alat yang memudahkan proses sesi scripting, meskipun saya lebih suka melakukan hal-hal secara manual (saya pikir ini lebih fleksibel). Alat-alat itu adalah Tmuxinator dan Teamocil .

Sumber informasi utama saya adalah buku "The Pragmatic Bookshelf" Tmux.

Dakatine
sumber
1
tidak terdengar seperti itu akan melakukan apa pun jika saya ingin mengembalikan sesi dengan 5 file terbuka. Tidak ada cara untuk melakukan itu?
chovy
4
Tmux tidak tahu apa-apa tentang keadaan proses yang mungkin telah Anda jalankan. Anda bisa skrip membuka file yang sama dengan memiliki perintah 'kirim-kunci' atau 'jendela terpisah' menjadi 'vim file1 file2 file3' atau melihat ke manajemen sesi editor Anda (vim -S dan sejenisnya)
bloy
Apa tujuan tmux send-keys ...garis itu?
Dominykas Mostauskis
2
@DominykasMostauskis yang perintahnya mengirim penekanan tombol ke sesi yang ditentukan. Ini seperti memasuki sesi, dan memasukkan tombol-tombol itu dari keyboard. Dalam hal ini, Anda mengirim "~ / bin / script" diikuti oleh Enter.
Dakatine
1
kombinasi some command; if [ $? != 0 ]; then .....lebih mudah untuk menulis (dan membaca) sebagai: if ! some command; then ......
fonini
117

Saya menulis skrip bash sederhana yang tetap ada pada sesi tmux terbuka, jendela dan direktori kerja saat ini di masing-masing.

Sebut seperti secara manual atau berkala dari cron (karena Anda mungkin lupa):

tmux-session save

Itu akan menulis ke ~/.tmux-session. Kembalikan setelah reboot seperti:

tmux-session restore

Saya menemukan ini jauh lebih baik daripada beberapa ratus skrip Perl panjang.

mislav
sumber
Apakah ini hanya jika Anda memiliki satu sesi tmux?
Sevenearths
86

Saya menulis plugin tmux yang memungkinkan Anda untuk menyimpan lingkungan tmux lengkap dan mengembalikannya nanti. Berusaha untuk benar-benar rinci sehingga Anda memiliki perasaan Anda tidak pernah berhenti tmux.

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

Pembaruan: sekarang ada plugin tmux-continuum yang melakukan penyelamatan latar belakang otomatis dari lingkungan tmux. Secara opsional ini juga * secara otomatis * mengembalikan tmux env setelah komputer dinyalakan kembali.


sumber
Sama seperti saya memposting "jawaban" saya dengan tautan yang sama saya melihat - "do'h!" Menemukan ini ketika mencoba mengingat apa nama plugin Anda.
phatskat
Plugin ini tidak buruk, tetapi tidak mengembalikan semua program saya. Akan membaca lebih banyak dokumen Anda dan mungkin mengirimkan masalah di github.
Arne
@ Andre Tergantung pada programnya, ini mungkin memerlukan pemeriksaan program. Sebagai gantinya, saya akan merekomendasikan mengkonfigurasi program Anda untuk mengembalikan - .vimrc file persisten dan posisi kursor untuk vim, dll - dan menyimpan tmux pane_current_command untuk program seperti man yang dapat dibuka kembali. Pos pemeriksaan sangat rumit menurut saya, tetapi layak untuk dilihat dalam hal apa pun.
John P
@ bruno-sutic apa perbedaan antara plugin Anda (tmux-resurrect) dan tmux-coninuum?
lony
Saat ini saya perlu menambal kontinum seperti ini untuk membuatnya berfungsi github.com/tmux-plugins/tmux-continuum/blob/master/docs/…
rofrol
10

tmuxinator adalah alat yang ditulis dalam Ruby, yang dapat digunakan untuk membuat dan mengelola sesi tmux dengan mudah. Ini dapat digunakan untuk membuat proyek, yang nantinya bisa dipakai sebagai sesi tmux.

Praveen Kumar
sumber
5

Pertimbangkan solusi parsial yang ditemukan di sini

Penulis membuat fungsi yang menyimpan sejarah sesi tmux untuk mempertahankan status sesi tmux setelah server reboot.

greg
sumber
17
Bisakah Anda memposting apa yang mereka katakan? Tautan dapat membusuk.
cpast
1
@cpast: Ini benar, tetapi komentar juga dapat membusuk. Terbaik untuk memberi keduanya :)
danielpops
6
@reg Tautan Anda menghasilkan 404
rofrol