当前位置: 首页 > 工具软件 > tmuxp > 使用案例 >

【DevOps 实践之路】(二)Tmux+Tmuxp 让部署与查看更方便

虞华翰
2023-12-01

几个痛点


在刚工作的时候,我直接把代码在 IDE 中进行编写并 shift + F10 运行,在一个 IDE 中可以同时运行多个程序,不用考虑部署问题;但是毕竟工作环境稳定性不够,断电、断网,机器更新重启等都会导致程序中断,于是为了稳定性,决定把程序部署在服务器上,即通过 Xftp 将代码上传到服务器之后,在 Xshell 中运行,但是 Xshell 中运行程序也会遇到一些问题。

1、本机通过 Xshell 连接到服务器后,编译程序、运行程序或者传输、下载文件时,如果遇到断电或者断网,Xshell将断开,应用也会中止;

2、同时运行多个应用时,需要开多个 Xshell 窗口,容易混乱;

3、如果有多个应用程序需要部署,一旦服务器重启,重新部署时容易忘记需要部署哪些应用;

Tmux


理解 Tmux

Tmux 全称 Terminal MultipleXer”,意思是“终端复用器”;

每次用户登录终端时会产生一个会话(session),也就是说,ssh 打开以后, bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉;

通过 Tmux 运行程序,运行的程序属于 tmux 的进程组, 不属于 ssh 进程组;

因此 Tmux 有如下几个功能:

1、Tmux 解绑了会话和终端窗口。关闭终端窗口再打开,会话并不终止,程序也可以保持运行;

2、单个终端窗口可以访问多个会话;

3、单个会话中可以开启多个窗口,从而运行多个应用程序;

使用 Tmux

1、安装

# Ubuntu 安装 Tmux
sudo apt-get install tmux

# Centos 安装 Tmux(最新版本)
# 第三方源的网站:http://galaxy4.net/repo/
sudo yum install http://galaxy4.net/repo/galaxy4-release-7-current.noarch.rpm
sudo yum install tmux
tmux -V

2、使用

https://github.com/tmux/tmux/wiki/Getting-Started

会话

# 新建会话
tmux new -s 会话名

# 新建会话但不进入
tmux new -s 会话名 -d

# 进入会话
tmux a -t 会话名(或前几个可以区分的字符)

# 退出会话
Ctrl+b d

# 列出所有会话
tmux ls

# 在会话中列出所有会话(可在会话中快速切换到别的会话)
Ctrl+b s

窗格

# 当前窗口分为左右两个窗格
Ctrl+b %

# 当前窗口分为上下两个窗格
Ctrl+b "

# 关闭当前窗格
Ctrl+b x

# 当前窗格全屏(或恢复)
Ctrl+b z

保存与恢复 Tmux 会话

https://www.linuxidc.com/Linux/2015-07/120304.htm
https://zhuanlan.zhihu.com/p/146544540

1、安装 tmux-resurrect

mkdir ~/.tmux
cd ~/.tmux
git clone https://github.com/tmux-plugins/tmux-resurrect.git

vim ~/.tmux.conf
run-shell ~/.tmux/tmux-resurrect/resurrect.tmux

tmux source-file ~/.tmux.conf

2、保存所有会话

在某个会话中

ctrl+b  ctrl+s

3、恢复所有会话
在某个会话中

ctrl+b  ctrl+r

Tmuxp


Tmuxp 简介

假如我们在一台服务器上开了很多个 tmux 会话,每个会话通过特定的名字来表示其中的业务,万一服务器发生故障重启,我们很容易忘记服务器上都有哪些会话,每个会话都有哪些窗格,运行了哪些程序;

如果我们可以把每个会话,每个会话里的窗格,每个窗格执行了什么程序保存起来,再复原这些应用程序就非常方便了,Tmux就是这样一个工具;

通过 yaml 文件将每个会话中各个窗格 ,以及每个窗格启动的程序记录下来,一个 yaml 文件对应一个会话;

优点:通过配置文件管理与记录会话的方式,方便存储业务所需的会话,方便复现业务的启动,方便移植后在新的环境启动,某些方面和K8S的优点比较像;

Tmuxp 使用

1、安装

pip install tmuxp

2、使用

可以配置三个级别,分别是 session,windows 和 panes,一个 yaml 文件只包含一个 session,可以配置多个 windows 和 panes;

vim mysession.yaml

start_directory: ./ # load session relative to config location (project root).
before_script: ./bootstrap_env.py # ./ to load relative to project root.
session_name: 4-pane-split
windows:
- window_name: dev window
  layout: tiled
  shell_command_before:
    - cd ~/                    # run as a first command in all panes
  panes:
    - shell_command:           # pane no. 1
        - cd /var/log          # run multiple commands in this pane
        - ls -al | grep \.log
    - echo second pane         # pane no. 2
    - echo third pane          # pane no. 3
    - echo forth pane          # pane no. 4
- window_name: dev window2

3、通过 tmuxp 命令 启动会话

# 启动某个会话
tmuxp load mysession.yaml
# 启动某个会话,但是不进入会话
tmuxp load -d mysession.yaml

# 启动某个文件夹下的有所会话
tmuxp load path/to/my/project/
tmuxp load -d path/to/my/project/
tmuxp load mysession ./another/project/

# 转换会话文件为json文件
tmuxp convert -y filename

我的实践


思路

Tmux 配合 Tmuxp ,我把日常运行的脚本程序都写在了 TmuxpBussiness 文件夹下的 yaml 文件里,然后上传到服务器,通过 tmuxp 一键启动多个会话;方便了在服务器上随时查看各个脚本的运行状态,接入 git + gitlab + webhook 后,频繁修改并重启某个脚本也非常方便。

实践

1、新建一个项目 DevOpsLab,在项目中新建一个文件夹 TmuxLab

2、在TmuxLab 新建一个 tmux_demo.py 文件,并编写

print("hello tmux")

3、在TmuxLab 新建一个 tmux_demo.yaml 文件,并编写

session_name: TmuxLab
windows:
- window_name: tmux_demo
  layout: tiled
  shell_command_before:
    - cd /usr/DevOpsLab/TmuxLab/
  panes:
    - python tmux_demo.py

4、将 TmuxLab 文件夹上传到服务器的 usr 目录下

5、在服务器上安装 Tmux 和 Tmuxp

sudo yum install http://galaxy4.net/repo/galaxy4-release-7-current.noarch.rpm
sudo yum install tmux
tmux -V
pip install tmuxp

6、通过 Tmuxp 启动 Tmux 并执行程序

tmuxp load -d /usr/DevOpsLab/TmuxLab/tmux_demo.yaml
 类似资料: