到点想下班了,但是代码还没跑完,怎么办?

2022-08-26 16:04:22 浏览数 (1)

作者 | 梁唐

到点想下班了,但是代码还没跑完,怎么办?

大家好,我是梁唐。

不知道大家有没有发现,自从本科毕业了之后,不论是出来工作还是读研进了实验室,我们越来越少在本地电脑上运行程序了。我们编写出来的代码,往往都是跑在其他地方,比如实验室里的服务器、公司的数据集群等等。

比较常用的方法就是通过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命令就可以了,比如:

代码语言:javascript复制
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了。

好了,我是梁唐,今天的文章就和大家聊到这里,感谢大家的阅读。

ssh

0 人点赞