几个痛点
在刚工作的时候,我直接把代码在 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