作者 | 梁唐
到点想下班了,但是代码还没跑完,怎么办?
大家好,我是梁唐。
不知道大家有没有发现,自从本科毕业了之后,不论是出来工作还是读研进了实验室,我们越来越少在本地电脑上运行程序了。我们编写出来的代码,往往都是跑在其他地方,比如实验室里的服务器、公司的数据集群等等。
比较常用的方法就是通过ssh命令连接到服务器,然后通过命令行来执行我们想要的命令。
但是这就有了一个问题,常常到了下班的时间,代码呢才刚运行到一半。这时候要是走了呢,运行结果就看不到了,有些程序(如spark)ssh连接一断直接shut down。
这就很尴尬了,断开吧程序已经跑很久了,断开了之前就白跑了,重新跑还不知道要多久。不断吧,谁也不知道还要跑多久,都已经到了下班的点了,也该回去休息了。
比如去年因为这个就有一条很出名的新闻,一个清华的学生一手骑车一手托着电脑,为的就是不让电脑休眠程序中断。吓得不明所以的围观群众纷纷惊呼,清华居然卷到学生都要一边骑车一边写代码了。
针对这样的问题,最好的方法就是使用终端窗口工具。常用的工具有screen和tmux,之前介绍过screen,最近发现tmux也非常好用。今天就和大家简单介绍一下tmux。
tmux是干啥的
很多人看到新名词会有本能的恐惧,但面对tmux完全不用慌,它就是一个工具而已,不是什么神奇的技术或者是黑科技。
tmux的用处也很简单,它可以在我们通过ssh连接远程机器的时候,在机器当中开辟一个窗口。然后我们在这个窗口当中输入命令,进行机器的交互。
我这么说估计很多同学会很费解,尤其是刚刚入门还不太了解的同学。这里的窗口可以理解成开启了一个应用,只不过这个应用也是命令行。
我用家里的树莓派给大家举个例子,我们直接ssh连接上树莓派是这样的:
就是一个命令行终端,我们可以在这里输入命令,控制树莓派里的文件,或者是运行某个程序。
当我执行命令tmux new -s rasp
,创建了一个新的会话(窗口)之后,终端就变成了这样。
会发现之前的那些日志统统不见了,重新进入了一个新的终端。并且在这个终端里鼠标滚轮不能用了,这是因为进入了tmux的会话之后,鼠标滚轮操作被赋予了新的功能。
我们在这个会话当中执行命令,即使执行到一半,ssh连接中断,也不会有任何影响。不再像之前一样,一旦ssh连接中断,不仅程序可能会被强制关闭,并且运行的日志也没有留下痕迹。
tmux常用命令
tmux用习惯了真的非常好用,也非常方便,尤其是当我们要做一些比较复杂的实验,或者是跑一些比较复杂的数据的时候。
熟练地使用tmux,真的可以带来非常大的便利。
我们从易到难,来简单分享几个命令的用法。首先是最简单的安装tmux,tmux是一个工具,有些机器里可能不一定自带,如果没有的话,需要我们安装。安装的方式也很简单,只要一条命令就行。
代码语言:javascript复制# Ubuntu 或 Debian
$ sudo apt-get install tmux
# CentOS 或 Fedora
$ sudo yum install tmux
# Mac
$ brew install tmux
安装好了就是使用了,首先是最简单的进入tmux,其实只需要输入命令tmux就可以了,输入之后就会进入一个全新的窗口。
我们要输入命令就直接在里面输入就行,和普通的终端是一样的。
想要退出也简单,我们可以直接Ctrl d
,也可以直接输入exit命令。
不过这样使用tmux完全没有发挥出tmux的功能,因为这样操作是退出了窗口,窗口内的程序也是会关闭的。我们想要的是退出了之后,窗口还在,里面的程序也照样运行。我们随时可以再重新进入,所以就不能退出窗口,而是暂时离开。
暂时离开的英文术语叫做分离窗口(detach),命令是Ctrl b d
,或者输入tmux detach
命令。这样我们既可以退出tmux窗口,又不会将它关闭。
想要重新窗口的时候,我们只需要使用tmux ls
命令查看一下tmux的窗口编号,接着使用tmux attach
命令接入即可。
因为我们是直接使用tmux命令创建窗口的,所以窗口的标识默认会是一个从0开始的数字。新建的第一个窗口叫做0,第二个叫做1,以此类推。
当然这样会引起歧义,所以我们可以使用tmux new -s
命令来给我们创建的会话一个名字。
比如:
代码语言:javascript复制tmux new -s pi
tmux new -s rasp
这样我们想要再重进的时候,只需要tmux attach -t pi
即可。
如果会话不想要了,想要杀死可以使用kill-session命令。
代码语言:javascript复制tmux kill-session -t 4
高端用法
以上只是tmux的基础命令,它的高端操作非常多,想要一篇文章讲完几乎不可能,所以只能挑选一些日常用的比较多的高端操作来介绍一下。
有的时候,我们的命令很复杂,分成多个步骤,如果使用一个窗口就会非常麻烦。毕竟一个窗口同时只能跑一个命令,一个命令跑完了才能执行下一个。如果分成多个窗口呢,检查其他命令的执行情况又会比较麻烦,需要在窗口之间切换来切换去。
切换当然是可以的,使用tmux switch
命令就可以了,比如:
tmux switch -t pi
但是还有更简单的办法,就是分割屏幕,把一个终端窗口拆分成好几块,我们可以自由在每一块当中运行我们想要的程序。
比如这是一个tmux的窗口。
我们使用快捷键Ctrl b %
,可以将它一分为二,分成左右两个部分。
这两个部分各自都可以运行程序,彼此之间完全独立。我们可以同时检查它们两边的状态,非常地方便。
不仅如此,我们还可以继续切分,比如我们可以继续执行Ctrl b "
命令,将窗口纵向切分。
只要你愿意,你还可以继续这样切下去。
切分之后,我们想要在窗格当中切换也非常简单,可以使用以下命令:
代码语言:javascript复制# 光标切换到上方窗格
$ tmux select-pane -U
# 光标切换到下方窗格
$ tmux select-pane -D
# 光标切换到左边窗格
$ tmux select-pane -L
# 光标切换到右边窗格
$ tmux select-pane -R
# 光标移动到上一个窗格
Ctrl b ;
# 光标移动到下一个窗格
Ctrl b o
有了tmux之后完美解决了两个问题,首先不用再担心要下班了但是程序还没跑完人不能走的窘境了。第二,当我们要做一些比较复杂的任务的时候, 也不用再担心窗口太乱,找不到头绪了。
我个人是非常喜欢tmux这样的工具的,学习的曲线并不陡峭,用很短的时间就可以学到很有用的工具,大大便利我们的日常工作。更重要的是,这样的操作逼格满满有木有,简直是职场装X利器,再也不用担心终端用得弱被同事diss了。
好了,我是梁唐,今天的文章就和大家聊到这里,感谢大家的阅读。