Screen实现多进程不挂断|Linux基础
前言
通常我们时常需要在终端同时执行多个命令,这时候,可以利用加分号的形式实现:
1 | cmd1;cmd2;cmd3 |
即 在多个命令之间使用;隔开。与之类似的,有&&表示一起执行等等。
然而事实上,这种运行内部依然具有执行上的时间顺序差。而且命令属于短时命令才达到预期。
也就是说,当一个命令需要不断print数据,而且迟迟不结束时(例如下载某些文件网速较慢),就压根不存在“同时运行”。
也就是说,我们正在寻求一种实现真正的多进程运行命令的方法。
在远程连接服务器的时候,需要面对这种问题
解决方法
再开一个会话/终端,实现两个(或多个)终端间的“真·平行视界”
但是如果是远程连接服务器的情况下,还会面临另一个问题,那就是当SSH连接断开时,命令也就截止了。
原因是因为断开连接后,终端会收到SIGHUP(hang-up 挂断)信号从而关闭该会话期的子进程。
那么,应该怎么实现断开远程连接,长时命令仍然继续运行呢?
这就是接下来即将介绍的多终端不挂断命令!
nohup命令(不推荐)
nohup 英文全称 no hang up(不挂起)
用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
语法格式
1 | nohup Command [ Arg … ] [ & ] |
参数说明
Command:要执行的命令。
Arg:一些参数,可以指定输出文件。
&:让命令在后台执行,终端退出后命令仍旧执行。
使用说明
待更
screen命令(推荐)
如果程序需要交互等复杂的操作,推荐使用功能强大的screen。
screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。
注意:不是所有Linux都自带screen。
查询安装包信息:
1 | rpm -qa|grep screen |
安装
自带则跳过这一步
1 | CentOS |
使用流程
🔔打开一个新会话,并对会话命名
1 | screen -S <name1> |
🔔于是,键入想要运行的命令
🔔暂时离开当前会话(快捷键)
Ctrl+A 之后再键入D
🔔打开另一个会话,命名
1 | screen -S <name2> |
🔔键入想要运行的命令,再Ctrl+A then D暂时离开
🔔杀死窗口:Ctrl+A then K关闭并杀死当前窗口
📝查看会话:
1 | screen -ls |
📝恢复某会话:
1 | screen -r <name> |
其他命令
待更
常见问题处理
使用
screen -r时提示There is no screen to be resumed matching xxx原因:在重新连接服务器时,即上次连接后没有主动断开连接(比如突然断网)。
解决方法:
1
ps all
查看所有进程,结果如下:
1
2
3
4
5
6
7
8
9
10F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 7961 27427 20 0 28920 1520 - R+ pts/0 0:00 ps all
4 0 23255 23254 20 0 21612 3932 wait Ss pts/5 0:00 /bin/bash
4 0 26472 26471 20 0 21612 3972 wait Ss pts/6 0:00 /bin/bash
4 0 27427 27342 20 0 22792 5100 wait Ss pts/0 0:00 -bash
4 0 27444 27342 20 0 22792 5060 wait Ss pts/2 0:00 -bash
4 0 27566 27444 20 0 42500 4164 poll_s S+ pts/2 0:01 top
4 0 28573 28572 20 0 21612 3644 poll_s Ss+ pts/1 0:00 /bin/bash
0 1000 32460 31875 20 0 31640 3068 pause S+ pts/0 0:00 screen -S boss此处以
screen -S boss为例。首先直接将其
kill掉(放心,不会杀死进程)1
kill -9 31875 #后面是对应进程的PPID码
之后重新进入就可以啦~
1
screen -r boss
暂无



