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
然后可以直接看到程序运行情况
标签:窗口,byobu,ssh,linux,进程,服务器,连接 From: https://www.cnblogs.com/77ff/p/18582025