个人博客,记录知识防止遗忘
screen与tmux实际使用及对比
screen与tmux实际使用及对比

screen与tmux实际使用及对比

当我们远程ssh连接服务器进行操作的时候,如果网络断开,则整个ssh会话会全部丢失,其上正在运行的前台任务也会直接挂掉
例如 在某服务器上通过 hive -e 查询一些数据,因数据量较大,筛选需要大概1个小时。这一个小时的时间里如果网络断开,则又得从头开始查询。

虽然linux下有个简单的nohup命令可以将任务挪到后台,但实际使用很麻烦(每一条命令前都得加nohup),并且不太稳定(搭配 bg,fg,ctrl +z 时有可能卡死)

此时screen和tmux的优点就极为突出了

这2者都是通过在服务器上建立类似“虚拟终端”的方式来保证会话不丢失的。

例如 同样是上述的hive查询,我可以先在服务器上开启一个screen/tmux 会话,然后在会话中执行相同的查询操作即便网络断开也没有什么影响,等网络恢复后重新接入该“虚拟终端”即可。

简而言之就是通过screen/tmux命令直接在服务器上生成了一个虚拟的第三方终端 ,网络断开也只是我们的xshell与“虚拟终端”之间的连接断开,并不会影响该“虚拟终端”与服务器的连接。

内容大纲

1    日常简单使用

screen与tmux可以直接通过yum或apt命令安装

在日常操作中,screen与tmux的绝大多数功能都用不到(尤其是屏幕分割。初识很惊艳,细品用不着。若真需要时再百度即可)

常用的命令有以下几个,确实是需要记忆的

1.1    screen

创建会话

# 创建新的终端
screen 

# 创建新的终端,并自定义终端名为test
screen -S test

# 创建新的终端,并自定义终端名为test, 但不进入会话
screen -dmS test

暂时离开会话

按住ctrl不放,依次输入a和d

查看已创建会话

screen -ls

进入会话

screen -r

使用sz和rz命令

进入screen 会话后,若直接使用sz/rz命令,会导致会话卡住,若要使用需要按照以下方法:

同时按住(CTRL和A键)然后输入:zmodem pass 然后再回车
即可使用rz/sz

强行中断传输

有时候使用中会卡住(例如误使用sz命令),此时可以按住ctrl ,再连点5次X键,即可恢复正常

退出并删除会话

exit

强制删除会话

# 有时需要使用以下命令强制删除会话

screen -S test -X quit

1.2    tmux

创建会话

# 创建新的会话
tmux

# 创建新的会话,并自定义会话名为test
tmux new -s test

# 创建新的终端,并自定义终端名为test, 但不进入会话
tmux new -s test -d

暂时离开会话

tumx有2种方法当当前会话置于后台:
方法1: ctrl + b , 松开2键后再输入d
方法2: 直接输入 tmux detach

查看已创建会话

tmux ls


进入会话**

# 默认进入第一个会话
tmux a 

# 进入到名称为test的会话
tmux a -t test 

# 其实完整命令为 tmux attach-session, 使用中一般都是简写为tmux a 

使用sz和rz命令

进入screen 会话后,若直接使用sz/rz命令,会导致会话卡住,若要使用需要按照以下方法:

同时按住(CTRL和A键)然后输入:zmodem pass 然后再回车
即可使用rz/sz

退出并删除会话

exit
或
ctrl + d

强制删除会话

# 仅仅删除test会话(即使是attached状态,也会删除)
tmux kill-session -t test

# 删除所有会话(attached状态的会略过)
tmux kill-session

在会话中切换其他会话

ctrl + b, 松开2键输入s 即可弹出选择界面,使用上下箭头回车确认即可

强行中断传输

有时候使用中会卡住(例如误使用sz命令),此时可以按住ctrl ,再连点5次X键,即可恢复正常

sz和rz命令

好像tmux不支持 zmodem 协议 by-pass,可能无法在会话中使用sz和rz

列出所有快捷键

# 列出所有快捷键,及其对应的 Tmux 命令
tmux list-keys

更多设置
其他不常用的设置, 如分屏,颜色等 可以参考这篇博客,挺全的
 http://louiszhai.github.io/2017/09/30/tmux/

2    在shell脚本中使用2个工具

2.1    screen

# 命令举例,每条命令都需要额外推一次换行符
screen -xS test  -p 0 -X stuff  "cmd"
screen -xS test  -p 0 -X stuff  $'\n'

image.png

# 进入虚拟终端可以看到已执行的命令
screen -r test

image.png

2.2    tmux

# tmux 使用send 命令进行推送,结尾可以加一个 enter ,直接回车
tmux send -t test "cmd" enter

image.png
image.png

3    对比

我之前一直用的是screen,后来转而使用tmux

总体来说日常的简单使用2者都可以,细节上tmux更好一点也更稳定。

例如:
screen 可以在会话中使用 -r 进入另一个会话,如下图所示image.png
这种操作可能会产生混乱,产生预期之外的影响。
tmux 不允许这种操作,但是tmux提供了一种更加方便的方法:
直接使用ctrl + b , s 即可打开如下窗口,可以自由选择一个进入,剩下的自动转变为detached状态
image.png
这是很人性化的一点设计

再如:
tmux 无法使用sz/rz , screen 中可以勉强使用,但是用起来很麻烦。
有这功夫我直接新开个xshell窗口,在会话之外使用sz/rz传输即可,
或者直接用xshell自带的xftp就可以(速度也更快),没必要非得用sz/rz

再如:
实际使用中,在screen中跑hive查数据,若会话处于attached状态(即没有放入后台)时网络出现故障,重连后会话有一定概率会锁死,导致工作全部白费,也就是感觉不太稳定,而tmux相对要好一点

3条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注