2019年2月12日 / 453次阅读
Linux
我们已经知道了如何让进程免受 HUP 信号的影响,也学习了setsid实现daemon进程,但是如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呢?
此时最方便的方法就是 screen了。简单的说,screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen 的参数很多,具有很强大的功能,我们在此仅介绍其常用功能以及简要分析一下为什么使用 screen 能够避免 HUP 信号的影响。
CentOS默认不带screen程序,需要安装:yum -y install screen
创建一个新的screen,在里面一直ping,然后退出这个screen窗口:
[xinlin@localhost ~]$ screen -dmS ping # 创建一个screen,名称为ping,但是不进入;用这种方法可以同时创建多个screen session
[xinlin@localhost ~]$ screen -ls # 列出所有screen窗口
There is a screen on:
5282.ping (Detached) # Detached表示当前不在这个screen里面
1 Socket in /var/run/screen/S-xinlin.
[xinlin@localhost ~]$ screen -r ping # 连接进入名称为ping的screen窗口
这里就进入了一个新窗口,我在里面测试ping
退出操作是Ctrl+ad
[detached from 5282.ping]
[xinlin@localhost ~]$
通过screen -r ping进入某一个screen session之后:
[xinlin@localhost ~]$ screen -ls
There is a screen on:
5282.ping (Attached) # Attached 表示里正在这个screen里面
1 Socket in /var/run/screen/S-xinlin.
在某个screen中,执行exit,就可以关闭这个screen的session,并可以看到:
[screen is terminating]
[xinlin@localhost ~]$ screen -ls
No Sockets found in /var/run/screen/S-xinlin.
为什么通过screen执行脚本之后,logout不会影响进程的执行?
这是未使用screen时的进程树:
[root@pvcent107 ~]# ping www.google.com &
[1] 9499
[root@pvcent107 ~]# pstree -H 9499
init─┬─Xvnc
├─acpid
├─atd
├─2*[sendmail]
├─sshd─┬─sshd───bash───pstree
│ └─sshd───bash───ping
通过pstree工具,我们可以看出,未使用 screen 时我们所处的 bash 是 sshd 的子进程,当 ssh 断开连接时,HUP 信号自然会影响到它下面的所有子进程(包括我们新建立的 ping 进程)。
这是使用screen时的进程树:
[root@pvcent107 ~]# screen -r Urumchi
[root@pvcent107 ~]# ping www.ibm.com &
[1] 9488
[root@pvcent107 ~]# pstree -H 9488
init─┬─Xvnc
├─acpid
├─atd
├─screen───bash───ping
├─2*[sendmail]
而使用了 screen 后就不同了,此时 bash 是 screen 的子进程,而 screen 是 init(PID为1)的子进程。那么当 ssh 断开连接时,HUP 信号自然不会影响到 screen 下面的子进程了。
远程操作云服务器,进行大批量脚本运行的时候,screen几乎是必须的工具。
本文链接:https://www.maixj.net/ict/screen-20091
©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。