ssh连接linux服务器中断后,如何让命令继续在服务器运行
ssh与服务器之间的通信断掉了,这个通信断掉之后linux程序默认将该连接下的所有进程都杀掉
解决办法
- 使用screen session
简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:
- 直接在命令行键入screen命令
$ screen
Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
- screen命令后跟你要执行的程序
$ screen 【后面跟你执行程序的命令】
Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。
- 以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c ,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。
screen的简单使用:
在所要执行的指令前添加screen.然后程序的运行等一切正常。(nohup的输出是定向到了nohup.out文件中,然而screen指令的输出是直接输出到了屏幕上的)
这个时候如果ssh终端断开了连接。我们只需要再次连接服务器然后输入指令
screen -ls
然后会得到类似下面的结果:
There is a screen on:
27267.pts-19.TITAN-X (09/08/2017 03:49:10 PM) (Detached)
1 Socket in /var/run/screen/S-kkk.
这里就会显示ssh断开之前的程序,其实断开后程序依然在后台在运行,只是我们这个时候需要将它放到前台来运行。这个时候我们们已经通过screen -ls查询到了线程号是27267了,所以我们只需要执行下面的指令即可恢复到前台了。
screen -r 27267
想杀掉终端执行
kill 27267
更多的指令可以通过screen --help
来学习
几个screen常用命令
命令 | 说明 |
---|---|
screen | 创建一个screen session |
screen -ls | 列举当前screen session |
screen -list | 同上 |
screen -r [session] | 恢复screen session并显示期间输出 |
screen -X -S [session] kill | kill某个screen session |
- 使用Tmux(Terminal Multiplexer)
除了screen提供的所有选项,Tmux允许在多个窗口之间水平或垂直拆分窗格、调整窗口窗格的大小、会话活动监视、使用命令行模式编写脚本等。
步骤:
1. 启动Tmux session:(连接服务器,)bash键入tmux
2. 此时bash的命令已经不会因为关闭bash而中断
3. 使用Ctrl+b then d来分离这一段输入的命令。
此时你可以安心关闭远程连接了
4.(重新登录服务器)使用tmux attach重新打开你的screen session
- 使用nohup命令
用途:不挂断地运行命令
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
nohup your_command &
回车后会给出一个id,重登录时使用fg %your_id
来进入之前的session
- byobu命令
byobu感觉就是screen的一个升级版本,界面比较友好,操作也比较方便。
一般Ubuntu系统开始的时候默认没有安装,我们需要手动安装byobu:
sudo apt install byobu
关闭当前窗口其实Ctrl+D就可以完成,剩余操作我们可以F9查看byobu的帮助即可。
如果我们想要一登陆就显示byobu界面的话,可以使用指令:
byobu-enable
如果想取消一登陆就显示byobu界面可以是用指令
byobu-disable
- disown命令
disown从系统的流程session列表中删除当前session,因此进程在bash关闭后不会被终止,因为它不会收到 shell 的 SIGHUP。
此方法的缺点是程序不能与stdin和 stdout交互(当然你可以重定向输入和输出),当session尝试与 stdin 或 stdout 交互时,进程就会停止。
语法:
diswon your_command
- setsid命令
可以认为setsid时nohup命令的改良版本。nohup 有一个缺点——执行命令的进程组不变,因此使用 nohup 执行的命令容易受到影响,而setsid命令的进程组时可以变化的,规避了nohup的缺点。语法与nohup类似。
语法:
setsid your_command
PS
nohup虽然可以把所有的输出都写入到nohup.out中间来,但是在面对需要人机交互的时候它就不能正常使用了。另外在我做测试的时候,一旦ssh断开,虽然程序还在后台运行,但是好像并不会再把输出写入到nohup.out文件中,这一点很不好。
screen相比之下就强大了很多,不仅可以满足人机交互,而且还可以将所有的输出都再次展示出来,方便我们查看。我对screen的理解是,其实它是一个虚拟的终端,我们运行的时候screen指令就为我们创建了一个虚拟的终端,所以我们再次连接后我们打开的还是这个虚拟的终端,所以我们可以更好的进行操作,而且screen支持开很多个终端。
byobu相比之下继承了screen的所有优点,并且拥有了更加方便快捷的操作界面,同时在界面下方还能很好的显示目前计算机的硬件使用情况,十分方便。