使用 screen 代替 nohup

序言

最近赶 ddl 每天都要做好多好多的实验得出结果,然鹅深度学习的任务每次一般都要跑很久,在这个期间如果 VPN 断开或者其他不可抗拒的因素都会让前面的训练白跑了 QAQ

没错,千千用的就是组里申请到的服务器,所以得连接 VPN 才能访问到,没钱自己买嘤嘤嘤😭

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 435.21       Driver Version: 435.21       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  TITAN Xp            Off  | 00000000:01:00.0 Off |                  N/A |
| 23%   25C    P8     9W / 250W |     10MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  TITAN Xp            Off  | 00000000:02:00.0 Off |                  N/A |
| 23%   29C    P8     9W / 250W |     10MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

 

以前经常使用 nohup 这个命令,然后将运行的程序放在后台,程序的输出重定向到文件里,命令类似于以下这样。(详细使用教程可自行查询)

nohup python train.py &

对于 nohup 呢,千千个人感觉使用它程序的输出与本地文件中的内容时间上往往是有延迟的,一些情况下可能还会出现不匹配的问题(之前在使用 tqdm 时穿插着 print 有遇到过)。

总想找一个简单方便的方法来解决连接断开程序停止运行的问题,之前有人推荐 tmux 然后没有精力去研究就放弃了 QAQ

So,我们今天的主角 screen 登场啦~😝

刚刚也教女朋友学会了佯~

 

正传

screen 介绍

screen 允许用户可以通过它同时连接多个本地或远程的命令行会话,并在其间自由切换。

简单的说,在 screen 环境中,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。

 

screen 常用操作

创建新的 screen 会话

screen -S session_name

执行完这条命令以后,即可创建一个名为 session_name 的会话,当前终端也会自动 attach 到这个会话中,然后用户便可以在其中做想要做的事情啦,只要不结束会话,即使断线也不会影响之前所做的工作。

 

显示当前所有存在的 screen 会话

screen -ls

 

手动 attach 指定 screen 会话

screen -r session_name

这条命令可以使得当前终端重新进入 session_name 这一会话,用户既可以使用每个会话拥有的独立编号指定会话,也可以通过创建会话时的会话名来指定会话。(一般断线后重连就靠它了,有时候也会出现断线但指定会话处于 Attached 的状态无法使用 screen -r 恢复,这个时候可以先 screen -d 再进行 attach)

 

手动 detach 指定 screen 会话

screen -d session_name

该命令可以使得当前终端脱离指定会话,被脱离的会话仍在后台运行,可通过 screen -r 重新绑定。

 

detach 当前会话

快捷键:ctrl+a + d

 

kill 当前会话

快捷键:ctrl+a + k

(终端左下角应该会提示 Really kill this window [y/n]

 

kill 指定 screen 会话

嗯~ 可以先 attach 到指定会话中,然后执行命令 exit 终止该会话。

 

screen 记录查看

经常,我们在使用 screen 时假如屏幕上有很多很多的输出,如果 detach 后再 attach 很有可能屏幕上已经不能显示完整的记录了,但完整的记录依然保留着。

 

翻页查看

一种方法我们可以直接在窗口上查看历史记录,具体的做法是:

先按快捷键 ctrl+a + esc 进入 copy mode(终端左下角会提示)

然后此时可以使用 vim 中的那些简单的操作,比如 h/j 用来上下滚动,ctrl+b/f 用来上下翻页等。

 

写入日志

这种方法会将所有的记录写入文件中,供之后查看所需。具体的做法是在启动 screen 时增加 -L 的参数,如:

screen -L -S session_name

它会在当前目录(也可能是用户目录)下生成 screenlog.0 文件,其中便保存着 screen 中操作与输出的记录。

 

那如果已经创建了一个 screen,并且长时程序还在运行中,如何记录日志呢?

方法是有的,按快捷键 ctrl+a + H(大写的 H),此时终端左下角会提示 Creating logfile "screenlog.0".,再次按同样的快捷键会暂停记录,提示 Logfile "screenlog.0" closed.

使用这种方法便可以把我们的程序输出记录在文件里了。

但以上两种写入日志的方法操作的都是同一个文件,也就是说,如果有多个相似任务想要同时记录日志,会造成 screenlog.0 这个文件中的内容混乱。为了解决这一问题,我们可以使用第三种做法,也是一种推荐的做法

 

在 screen 配置文件 /etc/screenrc 最后添加下面一行(代表日志记录的路径):

logfile /tmp/screenlog_%t.log

%t 指 window 窗口的名称,对应 screen 中的 -t 参数,因此在启动 screen 时可以使用以下命令:

screen -L -t window1 -S session_name

这条命令所启动的 session_name 会话,窗口名称为 window1,其日志的记录位置在 /tmp/screenlog_window1.log

如果启动时没有 -L 参数,使用 ctrl+a + H 快捷键也会将日志记录在该路径之下。

 

Over

大致简单介绍一下,到这里就结束啦~

然后祝大家新年快乐呦~ 🎉

年度简报📝可能还得些天才能完成 QAQ

 

记得~ 勤洗手🙌~ 戴口罩😷~ 不出门🚶‍♂️~ 不聚会👨‍👨‍👧‍👦~

还是老老实实待在家里赶 ddl 好~

话说什么时候才能回学校呢?又是荒废的一天,想念学校🏫~


  • 12 只已被捕捉
    • 新闻头条 Chrome | 63.0.3239.132 Windows 7

      文章不错非常喜欢

      • 千千 Chrome | 80.0.3987.106 Windows 10

        哈哈,欢迎常来哦~