SSH 一断,跑着的任务就没了?tmux 把会话留下来
SSH 连上服务器,跑一个要半小时的任务,本地网络一闪断,终端跟着断了,任务也没了。这种事遇到一次,就会想找个办法让命令和终端解绑。tmux 就是干这个的:它在服务器上开一个会话,命令跑在会话里,终端只是连上去看一眼,随时可以断开、随时可以回来。
先理解 tmux 的一层关系
tmux 里有三层:服务器、会话、窗口。服务器是后台常驻的进程,一个用户通常只有一个;会话是工作的单位,一个会话可以对应一个任务;窗口是会话里的分屏,一个会话可以开多个窗口,每个窗口里跑不同的命令。窗口里还能再分窗格,左右或上下并排看。
平时只用记住会话这一层就够了:开一个会话,在里面跑任务,断开,下次再接回来。
开一个会话,跑一个长任务
登录服务器后执行:
tmux new -s backup
这就新建了一个名叫 backup 的会话,并自动接进去。在里面正常跑你的命令,比如一个要跑二十分钟的备份脚本。跑起来之后,按 Ctrl+b 再按 d,就从这个会话断开了。注意,断开不是退出,会话还在服务器上跑,脚本也继续跑。
这时候哪怕你关掉本地终端、合上笔记本,服务器上的 backup 会话都还在。
回来接上,看看跑完了没有
下次再登录服务器,执行:
tmux ls
列出当前所有会话。再执行:
tmux attach -t backup
就回到了 backup 会话里,屏幕上正是你离开时的样子,命令的输出都在。如果脚本已经跑完,退出码和最后几行日志也都在,不用再去翻日志文件确认。
如果当时开会话没起名字,可以用 tmux ls 看到的编号来接,比如 tmux attach -t 0。
一个会话里开多个窗口
一个会话不只放一个任务。会话里按 Ctrl+b 再按 c,新建一个窗口;按 Ctrl+b 再按 n 切换到下一个窗口,按 Ctrl+b 再按 p 回到上一个。窗口之间互不干扰,一个窗口跑备份,另一个窗口可以看日志。
如果想在一个窗口里左右并排看两个命令,按 Ctrl+b 再按 % 是左右分窗格,按 Ctrl+b 再按 " 是上下分窗格。光标在窗格之间用 Ctrl+b 加方向键切换。
任务跑完了,会话怎么收尾
任务结束、确认结果后,在会话里直接输入 exit,当前窗口就关了;一个会话的最后一个窗口关掉,会话也就自动结束了。也可以在外面用命令关掉:
tmux kill-session -t backup
不用的会话及时清理,免得 tmux ls 里攒一堆没人管的会话。还有一个容易踩的点:会话名别起得太随意,backup、build、deploy 这种见名知意的最好,过一周再回来,一眼就知道每个会话是干什么的。
两个容易踩的坑
第一个坑:在会话里又开了一个 tmux。登录服务器后,如果已经在某个 tmux 会话里,再执行 tmux new 会再套一层,快捷键会先被外层截住,里面的会话收不到。办法是先 tmux ls 确认自己是不是已经在会话里,尽量用 attach 回到已有会话,而不是新建。
第二个坑:把会话当成后台任务的万能替代。tmux 保的是“你回来还能看到”,不是“服务器重启后还在”。服务器重启后,会话和里面的进程都会消失。需要跨重启常驻的服务,还是应该写成 systemd 服务。tmux 管的是交互式长任务,不是系统服务。
用下来会发现,tmux 的价值不在功能多,而在心态变了:不用再盯着一个终端等命令跑完,也不用担心网络抖动。任务交给会话,人随时可以走开,回来再看结果就行。
- 点赞
- 收藏
- 关注作者
评论(0)