云计算百科
云计算领域专业知识百科平台

服务器断开SSH连接之后无法继续执行任务

一. 前言

也算是对我最近几天对云服务器学习的一个复盘,我购买了一个阿里云的主机,系统为Ubuntu。在使用的过程中我发现当我断开远程的ssh连接之后,原本在Terminal正在执行的任务就会立即中止。随即查阅资料解决了这个问题

二. 原因

通过SSH连接到远程服务器进行操作时,在这个连接窗口内的所有操作都依附于这个终端窗口,并将其作为父进程。而当终端关闭的时候,在这个窗口内执行的所有进程都会收到一个SIGHUP信号,故而任务被终止,通常终端关闭也有两种情况:

  • 操作完成手动关闭
  • 网络波动直接断开连接

而这对我们开发者来说是有点难以接受的,因为我们不可能永远开个一个ssh终端来执行任务,特别是有些任务特别耗时。那么事实上也有解决方案。

三. 解决方案

1. 使用nohup命令

我用的少,如想知道详细用法请移步 解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】

2.使用screen命令

  • 输入命令查看screen是否安装
  • screen -v

  • 如未安装,请输入安装命令(其他版本系统请自行查阅命令)
  • sudo apt-get update
    sudo apt-get install screen

  • 创建一个screen的会话
  • screen -S demo #创建一个名称为demo的窗口,记住!S要大写

  • 创建完之后我们就会进入到一个新的终端界面,在这里我们可以进行任务以及各种操作操作 在这里插入图片描述
  • 但我们设置好任务完成操作之后,如果想让他继续执行,比如说继续跑一个编译程序那么我们可以用Ctrl+A+D来挂起这个会话,我们就会回到主terminal。接着我们输入
  • screen -ls

    我们就可以看见创建的会话列表,如图所示: 在这里插入图片描述 这里的111206就是会话的id,demo就是咱们刚刚创建的会话名称。括号里面的内容就是会话的状态,有Detached状态和Attached状态,Detached表示分离状态,Attached表示正在关联状态。 6. 我们要重新加入一个会话,有两种方法

    screen -r id #这个id替换成你自己的会话id
    or
    screen -r name #这个name替换成你自己的会话名称

    -r 参数:

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

    exit #注意是在你的会话中执行exit而不是在主terminal

    我们再用screen -ls就发现会话列表为空了 在这里插入图片描述

    四.总结

    贴出一份命令总览

    screen -S 会话名 # 创建一个会话,例如 screen -S icy_hope
    screen -ls # 查看已有会话(会话id、会话名、状态)
    exit # 退出会话,慎用,想要让它后台运行,直接关闭窗口即可
    screen -r 会话id # 回到已离线(状态为Detached)的会话,会话id通过-ls查看
    screen -S 会话id -X quit # kill掉一个会话
    # 进入一个会话后可使用快捷键
    Ctrl+a+c # 创建一个新的窗口
    Ctrl+a+w # 列出窗口列表
    Ctrl+a+n # 回到下一个窗口
    Ctrl+a+p # 回到上一个窗口
    Ctrl+a+0-9 # 切换窗口,在第0个窗口和第9个窗口之间切换

    常用常新,一时间记不住没关系的,总有一天会全部记住的。

    • 【Linux】screen常用命令
    • 解决Linux关闭终端(关闭SSH等)后运行的程序或者服务自动停止【后台运行程序】
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 服务器断开SSH连接之后无法继续执行任务
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!