tmux保证重启后还可以运行进程
当我在服务器中开发多个项目的之后如果每一个都设置自动呃开机自动启动这样对我来说太过麻烦有没有什么很简单的方法
在服务器上开发多个项目时,为每个项目单独设置开机自启动确实很繁琐。最好的方法是利用 tmux 和其插件的强大功能,结合一个简单的脚本,实现一键启动和管理所有项目。
这里有两种简单有效的方法:
方法一:使用 tmux-resurrect 和 tmux-continuum
这种方法利用了之前我们讨论过的插件。你可以把所有项目都放在一个或几个 tmux 会话中。当服务器重启时,插件会自动恢复这些会话,包括所有窗口、面板和正在运行的程序。
优点:
全自动恢复: 最省心的方法,服务器重启后你什么都不用做,所有项目都会回到上次关闭时的状态。
状态持久化: 不仅仅是重启程序,你上次关闭时的所有窗口布局、vim 编辑器中的文件、htop 监控等都会恢复。
缺点:
依赖插件: 需要正确配置 tmux-resurrect 和 tmux-continuum。
不够灵活: 如果你只想启动某个项目,可能需要手动关闭其他项目。
如何操作:
统一管理: 在一个或多个 tmux 会话中,为每个项目创建一个独立的窗口。
正确配置: 确保 .tmux.conf 中配置了 tmux-resurrect 和 tmux-continuum。
开机自启动: 使用 systemd 服务确保 tmux 在开机时启动,并且 tmux-continuum 自动恢复上次的会话。
好的,让我详细解释如何实现“方法一”的开机自启动,即利用 systemd 服务结合 tmux-resurrect 和 tmux-continuum。
之前我们已经讨论了配置 .tmux.conf 文件的步骤,这里我们重点关注 systemd 的配置,这是实现开机自启动的关键。
1. 检查 tmux-continuum 配置
在继续之前,请再次确认你的 ~/.tmux.conf 文件中已经包含了以下配置,这些是自动恢复会话的基础:
# 添加 tmux-resurrect 和 tmux-continuum 插件
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
# 开启自动恢复功能
set -g @continuum-restore 'on'
# 运行 TPM
run '~/.tmux/plugins/tpm/tpm'
确保你在 tmux 会话中按下了 prefix + I 来安装并加载了这些插件。
2. 创建 Systemd 服务文件
systemd 是 Linux 系统中用于管理系统服务的工具。我们将创建一个服务文件,告诉 systemd 在系统启动时执行一个命令来启动 tmux。
创建服务文件:
以 root 权限创建一个新的服务文件,命名为tmux-autostart.service,并将其放在/etc/systemd/system/目录下。sudo vim /etc/systemd/system/tmux-autostart.service编辑服务文件内容:
将以下内容复制到该文件中。请务必将[你的用户名]替换为你自己的用户名,例如myuser。[Unit] Description=Tmux autostart on boot After=network.target [Service] User=[你的用户名] Type=forking ExecStart=/bin/bash -c "/usr/bin/tmux new-session -d -s boot_session" ExecStop=/usr/bin/tmux kill-session -t boot_session [Install] WantedBy=multi-user.target配置解释:
* [Unit] 部分:定义了服务的描述和依赖关系。After=network.target 表示这个服务将在网络服务启动之后才启动。
* [Service] 部分:定义了服务的行为。
* User=[你的用户名]:指定服务以哪个用户的身份运行。这非常重要,因为 tmux 会话和其配置都是属于你自己的用户。
* Type=forking:告诉 systemd 服务会以父进程的形式运行,并在后台分叉出子进程。
* ExecStart=/bin/bash -c "/usr/bin/tmux new-session -d -s boot_session":这是服务的核心命令。它会以你的用户身份,在后台(-d)创建一个名为 boot_session(-s)的 tmux 新会话。
* ExecStop=/usr/bin/tmux kill-session -t boot_session:定义了停止服务时执行的命令,即杀死 boot_session。
* [Install] 部分:定义了如何安装此服务。WantedBy=multi-user.target 表示该服务应在系统进入多用户模式时启动,这是大多数服务器的默认运行级别。
3. 启用并启动服务
服务文件创建后,你需要告诉 systemd 重新加载配置,并启用该服务。
重新加载
systemd配置:
每次修改.service文件后,都需要执行此命令。sudo systemctl daemon-reload启用服务:
此命令会创建符号链接,确保服务在系统启动时自动运行。sudo systemctl enable tmux-autostart.service立即启动服务(可选):
如果你不想重启服务器就测试服务,可以手动启动它。sudo systemctl start tmux-autostart.service检查服务状态:
你可以使用以下命令检查服务是否正常运行。sudo systemctl status tmux-autostart.service
4. 自动连接到 Tmux 会话
为了让你在登录服务器后能自动进入这个 tmux 会话,你可以在你的 shell 配置文件 (~/.bashrc 或 ~/.zshrc) 中添加以下代码:
# 如果不是在 tmux 会话中,则自动连接或创建一个
if [ -z "$TMUX" ]; then
tmux attach-session -t boot_session || tmux new-session -s boot_session
fi
tmux-continuum 插件的核心工作原理:
tmux-continuum会自动在后台每隔一段时间保存你的 tmux 会话状态。- 当
systemd在开机时执行tmux new-session命令时,tmux-continuum会检测到这是一个新启动的 tmux 实例。 - 它会立即读取上次保存的状态文件,并自动恢复所有的窗口、面板和程序。
这样,你就不需要为每一个项目单独设置启动,只需要在 tmux 中正常工作即可。重启后,一切都会自动恢复到你离开时的状态。