当我们远程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'
# 进入虚拟终端可以看到已执行的命令
screen -r test
2.2 tmux
# tmux 使用send 命令进行推送,结尾可以加一个 enter ,直接回车
tmux send -t test "cmd" enter
3 对比
我之前一直用的是screen,后来转而使用tmux
总体来说日常的简单使用2者都可以,细节上tmux更好一点也更稳定。
例如:
screen 可以在会话中使用 -r 进入另一个会话,如下图所示
这种操作可能会产生混乱,产生预期之外的影响。
tmux 不允许这种操作,但是tmux提供了一种更加方便的方法:
直接使用ctrl + b , s 即可打开如下窗口,可以自由选择一个进入,剩下的自动转变为detached状态
这是很人性化的一点设计
再如:
tmux 无法使用sz/rz , screen 中可以勉强使用,但是用起来很麻烦。
有这功夫我直接新开个xshell窗口,在会话之外使用sz/rz传输即可,
或者直接用xshell自带的xftp就可以(速度也更快),没必要非得用sz/rz
再如:
实际使用中,在screen中跑hive查数据,若会话处于attached状态(即没有放入后台)时网络出现故障,重连后会话有一定概率会锁死,导致工作全部白费,也就是感觉不太稳定,而tmux相对要好一点
为 tmux 写了一个代替 rs/sz 的工具:https://github.com/lonnywong/trzsz
感谢补充
tmux 中 sz/rz 的替代方案 [trzsz](https://github.com/lonnywong/trzsz)
trzsz