避免SSH断连:长时间运行程序的守护进程解决方案
避免SSH断连:长时间运行程序的守护进程解决方案
在远程服务器上运行长时间任务时,SSH连接的稳定性是一个常见的问题。一旦连接中断,正在运行的程序可能会被迫终止,导致之前的努力付之东流。为了解决这一问题,本文将介绍两种常用的解决方案:使用JupyterLab的终端和screen工具,帮助你确保程序能够持续运行,不受SSH连接状态的影响。
当用户通过SSH登录或使用基于SSH的工具(如XShell、PyCharm、VSCode等)进行远程调试时,长时间运行的程序请务必以守护进程的方式执行,以避免因SSH连接中断而导致程序终止,造成不必要的损失。
有多种方式可以通过守护进程来执行程序
- screen,此外还有常用的tmux工具(如需安装执行:apt-get update && apt-get install -y tmux 这里不做介绍)
- Jupyterlab的终端(如果你使用的是Notebook,Notebook断网后日志更新问题将会更新在下方)
JupyterLab终端解决方案
最简单的方式是通过JupyterLab的终端来执行程序。只要JupyterLab不重启,终端将一直运行,即使本地主机断网或关机也是如此。
关闭的终端tab,可在左侧栏中找回
打开时如果终端未显示内容,按回车键即可。
在使用JupyterLab长时间跑代码的过程中强烈建议对日志重定向,防止断网后中间的日志丢失。
使用方法:
#日志重定向到train.log文件。
python xxx.py > train.log 2>&1
#实时查看日志
tail -f train.log
Notebook的日志不更新问题
可以使用「日志控制台」查看日志
打开日志控制台:
screen工具解决方案
screen是一个常用的终端复用工具,可以让你在断开SSH连接后,程序仍然在服务器上继续运行。以下是screen的基本使用方法:
1. 安装screen
在终端中执行:
apt-get update && apt-get install -y screen
2. 创建一个新会话
终端中执行screen命令,然后在出来的界面按回车键,此时会出现和之前一样的终端页面。
echo "defencoding GBK" >> ~/.screenrc
echo "encoding UTF-8 GBK" >> ~/.screenrc
3. 离开会话
在用screen打开的终端中使用快捷键:ctrl + a +d,会退出到原终端,并且显示detached,意味着此会话只是离开并未退出。
4. 重进入会话
先找到所有离开的会话:
然后恢复到对应的会话:
执行完以上命令,我们会发现最开始执行的ping www.baidu.com仍然在执行。因此就可以将我们的程序放在screen的会话中执行,然后离开会话,等我们需要查看日志时再恢复。
5. 退回会话
在用screen打开的终端中使用快捷键:ctrl + d
如果有正在执行的程序,先ctrl + c终止程序
screen乱码问题
加上 -U 参数即可,比如
新建:screen -U
恢复:screen -U -r xxx