Harbin Institute of Technology Amateur Radio Club

ssh到服务器运行一个程序为什么会挂

<p align="right"> 作者:Myrfy</p>

<p align="right"> 归档人:BG2DGR</p>

用SSH运行的程序为什么在你断开SSH时候挂掉

我们会遇到这样的问题:我使用SSH登陆到一个远程服务器,我在上面打开了一个程序(比方说我用远程服务器下载一个数据集9GB左右)我希望我在远程服务器下载完之后拖回本地,这样我的电脑就不用长时间开机了。</p> 于是,我运行了下载程序比方说wget, 断开SSH,等8小时之后(上完一天的课),等我再次登陆服务器,发现下载被终止了。mmp

SIGHUP

假设你ssh到一个机器,然后在里面直接启动一个程序,然后你的ssh断了(断网也好,主动退出也好,总之就是ssh会话断了),这个时候,被ssh链接的机器会给通过ssh启动的程序发一个SIGHUP信号,一般程序收到这个信号的反应是:停止运行

所以,对于一般在SSH下启动的程序,会话断了,程序就被kill了。当然,你可以在你的程序里拦截SIGHUP,这样,你的程序就可以在SSH会话断开后继续运行

nohup 一个解决方案

对于大部分程序,默认是不捕获SIGHUP的,所以如果你想在断开SSH后继续保持程序运行,可以用nohup这个程序来启动你想要启动的程序,这个时候,nohup会帮你吞掉SIGHUP,真正要运行的程序收不到这个信号,就可以在SSH断了以后继续运行

SSH链接

为什么会有SIGHUP信号呢?因为每一个SSH链接实际上都是在服务端创建了一个虚拟的TTY控制台(pty),ssh会话断的时候,pty也被销毁了,这个时候触发了SIGHUP

解决SIGHUP

所以有的人就开发了一个软件:我在机器上运行一个独立的程序,这个程序可以创建多个pty,同时还可以让外部链接到任意一个pty里面,查看pty的stdin stdout, 这就是tmux干的事。你先用ssh链接到一台机器上,然后跟那台机器上tmux创建的N个pty中的一个交互(这也就是tmux可以创建多个“window”的原理,每个window是一个pty) 只要tmux进程不挂,tmux管理的N个pty下面运行的程序也就不会挂。所以你的ssh链接断了无所谓,下次再连上机器,再通过tmux访问之前的某个pty里面的东西,都是ok的

上面的所有情况都在解决一个问题: ssh断了,怎么让程序继续运行

但是都没有解决一个问题: 程序自己挂了谁来重新启动它

supervisor

supervisor是用来监控程序是不是挂了的,如果程序挂了,supervisor把他重启起来

不要问supervisor自己挂了怎么办……没办法……这是个鸡生蛋蛋生鸡的问题。但是supervisor已经经过十几年的验证,是十分稳定的,他自己挂的概率可以忽略不计

一般会把supervisor注册为系统服务,这样系统启动以后,会首先启动supervisor,然后supervisor会启动你要的进程。 这样,即使你的机器意外重启了,机器重启以后,supervisor也会把所有需要的进程重新运行起来。

——The End


版权声明:

文章均由哈尔滨工业大学业余无线电俱乐部,技术部原创,转载请联系BY2HIT技术部 zhaoyuhao@by2hit.net