最近在通过SSH链接VPS执行长时间编译工作时,SSH断开后编译停止导致失败,该如何解决这个问题。
发现通过使用Screen虚拟终端管理器,建立新终端,这样进程就可以保留在后台运行,哪怕SSH断开也不会影响。
安装Screen
sudo apt-get install screen
使用Screen
使用Screen比较简单,只需要掌握建立、查询、切换不同终端命令即可。
首先建立新的终端
screen -S newterminal
-S参数后接新终端的名称,替换newterminal为你想要叫的终端名,例如lede
建立后会自动切换到新终端,此时执行命令就在新终端,并且退出SSH连接后,终端依旧保留后台执行。
列出已创建的终端
再第二次SSH链接VPS后,默认进入系统新建的终端,此时执行命令列出后台执行了终端
screen -ls
在图中可以看到我有个两个后台执行的终端和终端开始的时间
切换到运行中终端
接下来切换到后台运行中的终端
screen -r newterminal
newterminal为终端名称,可在列表中查看或者直接输入定义终端时取的名称
终端名称相同怎么办?
可以前面图片看到,我的两个终端都叫做lede,那么这里切换应该如何进入某一个喃。
这里切换时我们需要加上可选参数[pid]
screen -r pid.newterminal
pid的值可以在screen -ls中查看
例如现在我切换到第二个名为lede的终端
screen -r 106305.lede
切换后可以看到我的这个进程是昨晚编译openwrt的lede
整个执行时间超过4小时,进入终端后可以看到已经编译完成
退出Screen终端
退出Screen中建立的终端,回到SSH默认终端
执行
exit
显示screen is terminating 退出screen的终端连接,将会回到SSH默认的终端
其他参数
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业关闭。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
其余详情可以到官网查看
GNU’s Screen 官方站点:http://www.gnu.org/software/screen/