Відновити сеанс tmux після перезавантаження


255

Чи є спосіб зберегти сеанс tmux? Іншими словами, якщо я перезавантажую комп'ютер, я завжди втрачу сеанси?


1
Ви можете
перезимувати

36
Гібернація - це альтернатива тому, щоб ваш комп'ютер постійно працював, а не перезавантажувався.
чепнер

5
@chepner: Є ті дні, коли*** System restart required ***
karatedog

2
@karatedog Так, ми обидва погоджуємось, що сплячка не є рішенням втрати вашого tmux сеансу при перезавантаженні.
чепнер

Відповіді:


170

Так, якщо ви перезавантажите комп'ютер, ви втратите сеанси. Сеанси не можна зберегти. Але, вони можуть бути скриптовані. Найбільше насправді - це сценарій деяких сеансів, щоб ви могли їх створити заново. Наприклад, ось тривіальний скрипт оболонки для створення сеансу:

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

Ось що це робить. По-перше, він перевіряє, чи є якийсь сеанс вже з цим ім'ям (у цьому випадку, саме оригінальне ім'я - "скрипт") з tmux has-session . Він перевіряє код повернення. Якщо вже триває сеанс з цим ім'ям, він пропускає цикл "якщо" і переходить до останнього рядка, де він приєднується до сеансу. В іншому випадку він створює сеанс і надсилає до нього кілька ключів (наразі просто запущений випадковий сценарій). Потім він виходить з блоку "якщо" і вкладається.

Це дуже тривіальна вибірка. Перед створенням можна створити кілька вікон, панелей тощо.

Це не те саме, про що ви просили. Якщо ви внесете якісь зміни в сеанс, наприклад, ви перейменовуєте вікно і створите в ньому нову панель, якщо ви перезавантажите ці зміни, звичайно, не будуть збережені.

Є деякі інструменти, які полегшують процес сценаріїв сеансів, хоча я вважаю за краще робити речі вручну (я вважаю, що це більш універсально). Такими інструментами є Tmuxinator і Teamocil .

Головним моїм джерелом інформації була книга «Прагматична книжкова полиця» Tmux.


1
не здається, що це нічого не зробить, якщо я хочу відновити сеанс із відкритими 5 файлами. Немає цього зробити?
chovy

4
Tmux нічого не знає про стан процесів, які ви, можливо, виконували. Ви можете скрипт, у якому відкриті ті самі файли, за допомогою команди "send-keys" або "split-window" бути "vim file1 file2 file3" або заглянути в управління сеансом редактора (vim -S тощо)
bloy

Яке призначення tmux send-keys ...рядка?
Домінікас Мостаскіс

2
@DominykasMostauskis, що команда надсилає натискання клавіш на вказаний сеанс. Це як входити в сеанс і вводити ті самі клавіші з клавіатури. У цьому випадку ви надсилаєте "~ / bin / script", а потім Enter.
Дакатін

1
поєднання some command; if [ $? != 0 ]; then .....легше писати (і читати) , як: if ! some command; then ......
fonini

117

Я написав простий скрипт bash, який зберігає відкриті tmux сесії, вікна та поточні робочі каталоги в кожному.

Називайте це так вручну або періодично з cron (тому що ви можете забути):

tmux-session save

Це буде писати на ~/.tmux-session. Відновіть їх після перезавантаження так:

tmux-session restore

Я вважаю це набагато кращим, ніж кілька сотень рядків сценарію Perl.


Це лише якщо у вас один сеанс tmux?
Севенеартів

86

Я написав плагін tmux, який дозволяє зберегти повне середовище tmux і відновити його пізніше. Він прагне бути дійсно детальним, щоб у вас було відчуття, що ви ніколи не киньте tmux.

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

Оновлення: тепер є плагін tmux-континуум, який виконує автоматичні фонові збереження середовища tmux. За бажанням він також * автоматично * відновлює tmux env після перезавантаження комп'ютера.


Тільки що, коли я опублікував свою "відповідь" за тим самим посиланням, я подивився - "do'h!" Виявив це, намагаючись пригадати, як називався ваш плагін.
phatskat

Цей плагін непоганий, але він не відновив усі мої програми. Буде прочитано більше ваших документів і, можливо, надішлете проблему на github.
Арне

@Arne Залежно від програми, для цього може знадобитися контрольна точка. Натомість я рекомендую налаштувати ваші програми на відновлення - стійкі .vimrc файли та позиції курсору для vim тощо. - та зберігати tmux pane_current_command для таких програм, як man, які можна повторно відкрити. Перевірка на мій погляд є дуже складною, але варто розібратися в будь-якому випадку.
Джон П

@ bruno-sutic Яка різниця між вашим плагіном (tmux-resurrect) та tmux-coninuum?
lony

Наразі мені потрібно було виправити такий континуум, щоб він працював github.com/tmux-plugins/tmux-continuum/blob/master/docs/…
rofrol

10

tmuxinator - це інструмент, написаний на Ruby, який може бути використаний для створення та управління сеансами tmux з легкістю. Він може бути використаний для створення проекту, який згодом може бути створений як tmux сесія.


5

Розглянемо це часткове рішення, знайдене тут

Автор створює функцію, яка зберігає історію сеансу tmux для збереження стану сеансу tmux після перезавантаження сервера.


17
Чи можете ви, будь ласка, опублікувати те, що вони кажуть? Посилання можуть загнивати.
cpast

1
@cpast: Це правда, але коментарі також можуть гнити. Найкраще дарувати обом :)
danielpops

6
@greg Ваше посилання повертається 404
rofrol

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.