当前位置: 首页 > news >正文

网络断开导致SSH会话和服务端任务终止的原因及使用screen详解

在进行深度学习任务时,常常在本地通过ssh连接远程服务器进行炼丹任务。当我在pycharm上远程连接到服务器上进行训练时,由于网络不稳定使得SSH断开连接,我原以为服务器不会受影响。通过nvidia-smi命令发现GPU占用为0,这才发现任务终止了。
于是查阅了一些资料,整理至此。

一、网络断开连接导致服务器任务终止的原因

通过SSH连接到远程服务器进行操作时,如果本地网络断开,通常会导致SSH连接中断,进而导致服务器上的进程也停止运行。这是因为SSH连接是建立在一个会话(session)上的,当这个会话因为网络断开而结束时,会话内的所有进程都会收到一个SIGHUP信号,导致它们被终止

在Linux系统中,每个会话都有一个控制终端(controlling terminal),当SSH连接建立时,SSH客户端(指发起连接的一方,通常是指用户的本地计算机)成为远程会话的控制终端。如果SSH连接断开,控制终端丢失,导致会话结束,会话中的所有进程都会收到SIGHUP信号,除非这些进程被特别配置为忽略这个信号。

以下是对SSH会话的几个关键点理解:

  1. 独立的交互环境:每个SSH会话为用户提提供了一个独立的交互环境,类似于在本地控制台上的操作。用户可以在会话中启动多个程序,进行输入输出操作。

  2. 进程关系在SSH会话中启动的任何程序都是该会话的一部分。这些程序被称为会话的子进程,它们共享会话的输入输出。

  3. 控制终端:SSH会话通常与一个伪终端(pseudo-terminal)相关联,它模拟了一个物理终端的行为。这意味着即使在远程服务器上,用户也能像使用本地终端一样与程序进行交互。

  4. 生命周期:SSH会话有自己的生命周期,从用户通过SSH客户端连接到服务器并被认证开始,直到用户注销、关闭连接或服务器端强制断开连接结束。

  5. 信号传递当SSH会话结束时(例如,用户主动退出或网络问题导致连接断开),会话内所有进程都会收到一个SIGHUP(挂起)信号。默认情况下,这会导致所有子进程被终止

简单来说是网络断开时,系统会发送给会话内的所有子进程一个SIGHUP信号,会使得所有子进程终止。

二、使用screen命令解决

screen 是一个非常强大的工具,它允许用户在单个SSH会话中使用多个shell窗口(会话),并且能够在网络断开后保持会话和进程继续运行

工作原理

当启动screen时,它会创建一个新的会话,并在这个会话中启动一个shell。如果断开了SSH连接,screen会话仍然在服务器上运行。当重新连接时,可以重新附加到这个screen会话,继续你的工作
screen通过创建一个伪终端(pseudo-terminal)来实现这一点,它拦截了所有发送到前台进程的信号,如SIGHUP,这样即使SSH连接断开,这些信号也不会被发送到screen会话中的进程

使用步骤:

1. 安装screen

如果系统还没有安装screen,可以通过包管理器安装。对于基于Debian的系统(如Ubuntu),使用以下命令:

sudo apt-get update
sudo apt-get install screen

对于基于Red Hat的系统(如CentOS),使用以下命令:

sudo yum install screen

我之前安装好了,就不放安装截图了。

2. 启动一个新的screen会话:

通过SSH连接到远程服务器后,直接输入screen命令并按回车键,这将启动一个新的screen会话。你也可以为会话指定一个名称,以便之后更容易地重新附加到该会话:

screen -S mysession

记住是大写的S,结果如下:

会出现新的会话窗口。

3. 在screen会话中运行命令或程序:

screen会话中,可以像平常一样运行命令或启动程序。例如,你可以启动一个文本编辑器,或者开始一个长时间的编译过程。
比如切换到目标目录,运行一个耗时较长的深度学习训练的python程序。

python xx.py

此时代码已经运行了。

4. 分离screen会话:

当你需要暂时离开或断开SSH连接时,可以在screen会话中按下Ctrl-A,然后按D。这将使你从当前会话中分离出来,但会话及其中的进程仍然在后台继续运行。

Ctrl-A-D可以理解成离开这个会话。之后返回原本的终端界面。

5. 重新连接到screen会话

当你重新连接到服务器时,可以使用以下命令来列出所有可用的screen会话:

screen -ls

如下图

会话可以处于两种状态:Attached(已附加)和 Detached(已分离)
图中 hds_unet会话显示(Attached) ,表示当前与某个终端或SSH会话关联,而其他会话则在后台独立运行,等待用户重新附加

使用以下命令将之前关闭的mysession重新附加到之前的会话:

screen -r mysession

-r 参数

  • -r 参数用于重新附加到一个已经存在的 screen 会话。
  • 当你使用 screen -r session_name 命令时,如果 session_name 指定的会话已经存在并且处于 Detached(已分离)状态,这个命令会将你重新连接到这个会话,使其变为 Attached(已附加)状态。
  • 如果会话已经处于 Attached 状态,-r 参数将允许你加入到会话中,这样你就可以与其他用户共享同一个会话,并且可以看到相同的输出。

如果没有为会话指定名称,可以使用会话的ID来重新附加。
此时通过 screen -ls 命令查询mysession状态
如下图

Attached表明正在关联。

6. 关闭screen会话

当完成工作后,可以正常关闭screen会话中的所有程序,然后输入exit命令或按Ctrl-D来结束会话。此时通过 screen -ls 命令查询不到mysession。


http://www.mrgr.cn/news/49952.html

相关文章:

  • STM32L010F4 最小系统设计
  • Docker学习笔记(2)- Docker的安装
  • 东方通 TongRDS V2 配置与开机自启指南及 Spring Boot 集成
  • OpenCL 在命令行中clinfo 信息
  • 信号(一)【概念篇】
  • transformers不指定版本能装上,指定版本transformers==4.15.0装不上
  • NVIDIA RTX A1000 显卡测评 Thinkpad P16v 测评
  • 04 django管理系统 - 部门管理 - 新增部门
  • 在java 中如何实现执行linux命令,通过post接口代理出来?
  • 【Hadoop】HDFS基本操作
  • JavaScript 常用方法
  • 牛客网上最全的Java八股文整理,涵盖Java全栈技术点
  • 如何下载3GPP协议?
  • 智慧交通:科技保障出行安全
  • 智慧灌区信息化管理系统解决方案
  • Libevent源码剖析-开篇
  • ffmpeg截取一段视频中一段视频
  • 从源码到平台:使用视频美颜SDK构建高性能直播美颜系统详解
  • 怎么把wma格式转换成mp3?介绍几种wma转换成MP3的转换方法
  • 麦沃德提升会议效率与质量:一款全面的会议管理系统