重新启动后还原tmux会话


255

有什么方法可以保存tmux会话吗?换句话说,如果我重新启动计算机,是否总是会丢失会话?


1
您可以休眠到硬盘作为替代
马特·弗里曼

36
休眠是替代使计算机持续运行而不是重新引导的一种方法。
chepner 2012年

5
@chepner:还有那些日子*** System restart required ***
karatedog

2
@karatedog是的,所以我们俩都同意休眠不是解决重启时丢失tmux会话的解决方案。
chepner 2015年

Answers:


170

是的,如果重新启动计算机,则会丢失会话。会话无法保存。但是,可以编写脚本。实际上,大多数操作是编写一些会话脚本,以便您可以重新创建它们。例如,下面是创建会话的简单shell脚本:

#!/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检查该名称是否已经存在任何会话(在这种情况下,原始名称为“ script”)。它检查返回码。如果已经有一个具有该名称的正在进行的会话,则它将跳过“ if”循环,而直接转到最后一行,它将附加到会话上。否则,它将创建一个会话并向其发送一些密钥(目前仅运行随机脚本)。然后退出“ if”块并附加。

这是一个非常琐碎的示例。附加之前,您可以创建多个窗口,窗格等。

这会不会是你问同样的事情,但。如果您对会话进行了任何更改,例如,您重命名了一个窗口并在其中创建了一个新窗格,如果重新启动,这些更改当然不会被保存。

有一些工具可以简化脚本编写会话的过程,尽管我更喜欢手动操作(我认为它更通用)。这些工具是TmuxinatorTeamocil

我的主要信息来源是Tmux的《实用书架》一书。


1
如果我想恢复打开了5个文件的会话,这听起来没有任何作用。没办法吗?
chovy

4
Tmux对您可能已经运行的进程状态一无所知。您可以通过将'send-keys'或'split-window'命令设置为'vim file1 file2 file3'来打开具有相同文件的脚本,或者查看编辑器的会话管理(vim -S等)
bloy

tmux send-keys ...行的目的是什么?
Dominykas Mostauskis 2014年

2
@DominykasMostauskis该命令按键发送到指定的会话。就像进入会话,然后从键盘输入那些键一样。在这种情况下,您发送“〜/ bin / script”,然后按Enter。
Dakatine

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-continuum插件,可以执行tmux环境的自动后台保存。(可选)它还可以*自动*在计算机重启后自动恢复tmux env。


就像我用相同的链接发布我的“答案”一样-“做!” 在尝试记住您的插件被称为时发现了这一点。
phatskat 2014年

这个插件还不错,但是它没有还原我的所有程序。将阅读更多您的文档,并可能在github上提交问题。
阿恩(Arne)

@Arne根据程序,这可能需要程序检查点。相反,我建议配置您的程序以进行恢复-永久的.vimrc文件和vim的光标位置等-并为可重新打开的程序(如man)存储tmux pane_current_command。我认为检查点非常复杂,但是无论如何都值得研究。
约翰P,

@ 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's

6
@greg您的链接返回404
rofrol

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.