写在前面
自己的电脑连上服务器后,如果断网、关闭电脑、关闭终端、关闭IDE等都会导致远程服务器上程序退出,这对于需要长时间训练的程序是不可忍受的。
如何让连接断开时,服务器仍然继续执行我们的程序呢?
方法有多种:https://www.bbsmax.com/A/A7zgljQlJ4/
本文只讲screen方法。
- 一个screen相当于一个独立的环境,在screen中执行的程序都会被保护起来,不会因为终端关闭、远程连接断开、本地程序(vscode)退出等原因而被终止执行,其他与在普通terminal中执行程序没有半点差别。
- screen建立后,除了手动杀死,否则他一直存在,且不会被其他程序干扰。
一、建立远程连接
二、在服务器上远程创建screen
1. 创建screen
>> screen -S cgx_test
上述命令创建名为“cgx_test”的screen,在终端上可能不会出现明显变化,但实际上已经进入新建的screen了,此时再执行各种操作就都是在screen中进行了(表面上看不出啥不一样)。
2. 查看已经存在的所有screen
>> screen -ls
图中“80927”是系统为我们创建的screen分配的pid。
(attached):相当于处在当前screen窗口;
(detached):相当于最小化了(跳出)的screen窗口(该窗口内运行的程序正常运行);
(dead):相当于死了的窗口(已经无效的screen窗口,需要被kill掉);
(用上述命令实际上就可以查看当前处于那个screen,attached就是标志!)
3. 跳出当前screen
快捷键:Ctrl+a+b(有时需要多按几次),跳出当前screen。
4. 重新进入screen
>> screen -r pid_name 或 pid 或 name
重新进入某screen后,该screen的状况会从detached变为attached。
5. 彻底杀死screen
-
1)当前处于某screen内部
快捷键:Ctrl+b直接杀死当前screen;
命令:输入“exit”回车杀死当前screen(可能需要多次执行exit命令,因为screen中可能存在其他正在执行的程序也需要exit命令退出);
命令:用2)的命令杀死指定screen。
(注意:要看到‘screen is terminating’(如下图),对应screen才被kill。可用screen -ls查看是否还在。)
2)无论处于某screen内部还是处于普通终端(比如base)都可以用。
>> screen -S name -X quit
(注意:用该命令时,好像不出现screen is terminating信息。)
6. 检查所有screen,并一次删除所有死亡无效的screen
>> screen -wipe
三、screen 使用举例
-
1)情况1:直接执行远程代码,没有在本地编辑
此时,进行断网、关电脑、关闭终端等操作。然后再重新连接上服务器,打开终端,进入该screen,可以看到,程序依然在运行。
2)情况2:能否将vscode中的代码跑在screen中?
没尝试成功!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
等待解决!!!!!
参考:
https://www.cnblogs.com/watson04/p/16950232.html
https://blog.csdn.net/weixin_47317192/article/details/126649130
https://blog.csdn.net/weixin_44612221/article/details/126279971
https://blog.csdn.net/weixin_43570155/article/details/121845415
https://blog.csdn.net/zhang_j_mail/article/details/127091978
https://mp.weixin.qq.com/s?__biz=MzI2OTE0ODY5Mw==&mid=2247484435&idx=2&sn=4285f2bcce7582526c3aaf01e14b30c3&chksm=eae5f369dd927a7fd7f6fed2ad82986e37b883af346ea116179acc5280cde59014b403f64a8a&scene=27