Fan.Lai's blog
ssh连接linux服务器中断后,如何让命令继续在服务器运行
Published on 2024-12-02 15:52 in 分类: 学习笔记 with 凡琪7
分类: 学习笔记

ssh连接linux服务器中断后,如何让命令继续在服务器运行

ssh连接linux服务器中断后,如何让命令继续在服务器运行

这个问题也许是我们这些小白比较头疼的问题,尤其对于做机器学习需要花很久的时间才能训练出一个结果。然而就在这时,因为各种不可抗力我们使用ssh连接服务器时,ssh的窗口突然断开了连接,那么在服务器上跑的程序就也跟着断掉了,之前所有跑的数据也将丢失,这样将会浪费我们大量的时间。

参考链接:

http://blog.csdn.net/gukesdo/article/details/6901902

为什么ssh一旦断开我们的进程也将会被杀掉?

元凶:SIGHUP 信号

让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。

在Linux/Unix中,有这样几个概念:

进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。

会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。

会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

根据POSIX.1定义:

挂断信号(SIGHUP)默认的动作是终止程序。

当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。

如果会话期首进程终止,则该信号发送到该会话期前台进程组。

一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。

因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

这里我认为我们的进程被杀掉也就是因为ssh与服务器之间的通信断掉了,这个通信断掉之后linux程序就默认将该连接下的所有进程都杀掉

解决方案

针对上面的问题,上面的参考链接中也有讲解,在此进行一个简单的整理。

这里主要有三个方案,一个是使用nohup指令,一个是使用screen指令,最后一个是screen的升级版byobu。这三个指我更倾向于使用byobu指令,因为byobu指令更加的强大,是screen的升级版本,并且界面也比较友好。

byobu命令

byobu感觉就是screen的一个升级版本,界面比较友好,操作也比较方便。一般Ubuntu系统服务器开始的时候默认没有安装,我们需要手动在服务器中安装byobu:

sudo apt install byobu

安装好后在自己的ssh连接窗口输入byobu命令进入byobu窗口

byobu

在窗口中输入想要执行的命令

byobu的窗口基本简单操作

注意:直接在ssh连接窗口的shell中按下就行,不是说在服务器上按。

按键 说明
F2 新建窗口,当一个窗口已经在执行程序时,还想执行其他程序是可以新建一个窗口
F3 移动到前一个窗口
F4 移动到后一个窗口
F6 退出byobu窗口
F9 打开byobu菜单,查看帮助信息的配置信息

关闭当前窗口其实Ctrl+D就可以完成

剩余操作我们可以F9查看byobu的帮助即可。

如果我们想要一登陆就显示byobu界面的话,可以使用指令

byobu-enable

如果想取消一登陆就显示byobu界面可以是用指令

byobu-disable

byobu相比之下继承了screen的所有优点,并且拥有了更加方便快捷的操作界面,同时在界面下方还能很好的显示目前计算机的硬件使用情况,十分方便。

关闭ssh连接窗口后,想重新看到运行的程序

先打开byobu窗口,在ssh窗口输入

byobu

然后可以直接看到程序运行情况

posted @   凡琪7  阅读(161)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示