linuxshell脚本⽗⼦进程等待⼦进程,SHELL⽗⼦进程分析导⾔
本节将就shell交互(脚本执⾏)过程中涉及⼦进程(subprocess)以及⼦SHELL(subshell)的部分,配以实例,进⾏说明。将详细讨论如下问题:subprocess和subshell是什么
subprocess的产⽣过程是什么
什么情况下会产⽣subprocess和subshell
shell编程中,subshell需要注意些什么
如何管理subprocess
subprocess和subshell是什么
⼦进程(subporcess)是从⽗⼦进程的概念出发的。unix操作系统的进程从init进程开始,经过不断fork-exec“繁衍”,形成了树状的⽗⼦进程结构。每个进程均有其对应的⽗进程(0进程不在讨论范畴内),就算是由于⽗进程先⾏结束导致的孤⼉进程,也会被init(pid=1)领养,使其⽗进程ID为1。
⼦SHELL,顾名思义,就是由“当前shell进程”创建的⼀个⼦进程。因此,subshell概念是subprocess的⼦集,⼀个subshell⼀定是个subprocess。
subprocess的产⽣过程
事实上,所有进程的创建,都可视为⼦进程创建过程。unix操作系统进程的创建,基本可以归结为fork-exec的模式,即是:通过fork创建⼦进程环境,
通过exec加载并执⾏进程代码。
在shell环境中,即是:当前shell fork出⼀个⼦进程(即⼦shell),此时该⼦shell是⽗shell的⼀个副本;
在subshell⾥,根据path指定的⽬录列表⾥的⽬录,到外部命令command;
在subshell⾥,以到的命令command取代(exec)当前shell程序并执⾏,此时⽗shell等待subprocess⼯作完成;
命令完成后,控制流返回⽗shell,⽗shell再取下⼀条语句执⾏,或等待⽤户输⼊下⼀条;
什么情况下会产⽣subshell
&,提交后台作业
grep命令查看进程If a command is terminated by the control operator `&', the shell executes the command asynchrono
usly in a subshell.
管道
Each command in a pipeline is executed in its own subshell
括号命令列表 ()操作符
Placing a list of commands between parentheses causes a subshell environment to be created
执⾏外部脚本、程序
When Bash finds such a file while searching the `$PATH' for a command, it spawns a subshell to execute it.  In other words, executing filename ARGUMENTS is equivalent to executing bash filename ARGUMENTS
⽰例
1.shell在⼦shell中执⾏外部命令
⽐如在当前⽹络终端(通过ssh),键⼊ps -ef|grep work,看看进程树是如何的:$ echo $$        #得到当
前bash的pid 6010
$ pstree -n -a | less    #查看进程树
init(1)-+-migration/0(2)
|-ksoftirqd/0(3)
...
|-sshd(2679)---sshd(5997)---sshd(6009)---bash(6010)-+-pstree(9378)
|      `-less(9379)
从结果可以看到,所有进程由init派⽣⽽来,2679为sshd系统服务;5997和6009为sshd为work当前终端分配的⼀个session;6010为基于这个session的、为work⽤户提供交互操作的shell进程;由于包含管道命令,9378和9379为6010的⼦进程,即6010(bash)进程spawn了两次。
其中,当键⼊pstree | less 时,shell先分析pstree是否为⾮内建命令或别名,结果是外部命令,需要在⼦进程中执⾏之,故另启动⼀个进程(9378)去执⾏pstree命令;同样,less也按照上述⽅法执⾏。
2. 例1的延续
再来看下如果调⽤sh脚本,系统如何表现:
脚本⽰例:#! /bin/bash
ping 127.0.0.1 | tail -f | grep time &> /dev/null
$ sh test.sh
$ pstree -n -a | less    #查看进程树
|-sshd(2679)-+-sshd(5139)---sshd(5143)---bash(5144)---sh(10252)-+-ping(10253)
|            |                                                  |-tail(10254)
|            |                                                  `-grep(10255)
root      5139  2679  0 08:52 ?        00:00:00 sshd: work [priv]
work      5143  5139  0 08:52 ?        00:00:00 sshd: work@pts/0
work      5144  5143  0 08:52 pts/0    00:00:00 -bash
work    10252  5144  0 09:07 pts/0    00:00:00 sh test.sh
work    10253 10252  0 09:07 pts/0    00:00:00 ping 127.0.0.1
work    10254 10252  0 09:07 pts/0    00:00:00 tail -f
work    10255 10252  0 09:07 pts/0    00:00:00 grep tome
可见,当sh test.sh的时候,当前bash6010另启动⼀个subshell(10252)去执⾏test.sh内的语句,之后的语句可视作把10252作为“执⾏test.sh的主⼲道”,ping命令⼜作为10253的⼦进程执⾏,直到test.sh最后⼀句执⾏完毕,10252才结束并返回给交互式
bash6010。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。