ssh异常断开后防止前台运行的进程退出

Life is short , play more!
本文来自lihao's Blog,转载请注明。

问题:ssh异常断开后防止运行的进程退出

这里指的ssh断开,不是指的输入命令exit的退出。 而是指因网络,或者强制关闭当前的ssh连接客户端。 此时在当前shell ssh session中后台运行的进程会终止并退出。

例子:

1. ssh登陆到某台linux server
2. sleep 500 & (&如果不输入,下面的情况也一样)
3. 此时我们因为网络问题或者手动强制关闭当前ssh 客户端。
4. 则,我们ps -ef 看下, sleep 500 的进程消失了。

当我们运行耗时的命令时,当然不希望他们因为网络问题等, 没有运行完毕。

我们希望的是,

1. ssh登陆后
2. 运行一个比较耗时的命令
3. 当因为网络问题或者手动强制关闭了ssh 链接后, 第二步运行的命令被系统进程收编,继续运行。
4. 当我们重新ssh连接到该服务器后,可以继续观察此命令的运行情况。

解决方法:

1. 最为推荐的方法。 screen命令。

a) 安装screen命令
b) screen sleep 500 后 按下ctrl+a , 然后紧接着按下d 键

亦或者直接输入命令 screen -d -m sleep 500 则, 直接detach到后台。 通过-d -m的参数,也可以用于系统启动时启动脚本命令。

detach和attach的意思, 是将此进程的标准输出附着或者取消附着到当前的console里。

c) screen -ls 可以看到目前detach的所有进程
There is a screen on:
9146..game-center-vpnclient (Detached)
1 Socket in /var/run/screen/S-root.

d) screen -r 则可以attach 进程到当前的console里。

2. nohup (但不可以attach到当前的console里, 如果作为批处理的脚本不需要和人交互的,则可以通过此方法)

nohup sleep 500 >/dev/null 2>&1 &

3. 手动干预。

a) sleep 5 &
b) 立即输入命令 exit 退出shell, 则 sleep 5 被系统进程回收。


发表评论

电子邮件地址不会被公开。 必填项已用*标注