让代码在服务器后台运行

之前使用服务器进行深度学习训练的时候,如果中途断网,就与服务器失去了连接,跑了一半的代码也就会停止下来。同时在ssh连接会话中,如果不新建一个连接会话,就无法再做其他事情了。这些问题让人头疼,让人思考将代码放到服务器后台运行。

1. nohup

最直接简单的做法是:

$nohup python test.py

这样,代码就会在服务器后台执行。终端无法看到运行过程以及结果输出。期间运行的结果会生成一个nohup.out的文件中保存。使用文本编辑器打开就能看到。

2. screen

安装screen:

$sudo apt install screen

用这个可以为不同的任务开不同的窗口,窗口之间是可以切换的,同时,窗口和会话连接基本上没有任何区别,这样就可以在开一个连接的时候同时干多件事情,并且在终端看得到运行过程的同时而不会由于断网而导致代码停止运行。

新建窗口:

$screen -S name # 创建一个名字为name的窗口

新建完就会自动跳到新建的窗口,可以在这个窗口执行训练命令。

当你不想呆在这个窗口时,你可以通过快捷键Ctrl+a+D断开这个窗口的连接而回到连接会话界面(如果新建的窗口什么都没做,Ctrl+A+D即为退出结束窗口)。

查看存在的窗口:

$screen -S ls #可以查看已创建的所有窗口

执行上述指令后可以看到窗口的名字和id,Detached说明窗口是断开的,再次强调这里的断开是指没有让他显示,其对应的任务是在后台执行的。

如果想看其中一个窗口任务的执行状态,可以通过如下指令:

$screen -r test #重新连接到test窗口,显示其运行过程,如果只有一个窗口,可以screen -r即可

如果想直接停止某个窗口任务的运行,可以直接通过杀死id的方式

$kill 28475 #终止ssd窗口对应任务的运行,同时杀死该窗口
 Ctrl + A,D       #暂离当前会话
 Ctrl + A,C       #在当前screen会话中创建一个子会话
 Ctrl + A,W       #子会话列表
 Ctrl + A,P       #上一个子会话
 Ctrl + A,N       #下一个子会话
 Ctrl + A,0-9     #在第0窗口至第9子会话间切换

总结一下,screen可以实现代码在后台运行时的可视化,同时,能在开一个会话连接时创建多个窗口处理不同的任务。用起来也很方便。