建设flash网站,外贸公司网站源码,河池公司做网站,苏州seo关键词优化软件导言本节将就shell交互(脚本执行)过程中涉及子进程(subprocess)以及子SHELL(subshell)的部分#xff0c;配以实例#xff0c;进行说明。将详细讨论如下问题#xff1a;subprocess和subshell是什么subprocess的产生过程是什么什么情况下会产生subprocess和subshellshell编程中…导言本节将就shell交互(脚本执行)过程中涉及子进程(subprocess)以及子SHELL(subshell)的部分配以实例进行说明。将详细讨论如下问题subprocess和subshell是什么subprocess的产生过程是什么什么情况下会产生subprocess和subshellshell编程中subshell需要注意些什么如何管理subprocesssubprocess和subshell是什么子进程(subporcess)是从父子进程的概念出发的。unix操作系统的进程从init进程开始经过不断fork-exec“繁衍”形成了树状的父子进程结构。每个进程均有其对应的父进程(0进程不在讨论范畴内)就算是由于父进程先行结束导致的孤儿进程也会被init(pid1)领养使其父进程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提交后台作业If a command is terminated by the control operator , the shell executes the command asynchronously 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)...skipping...|-sshd(2679)---sshd(5997)---sshd(6009)---bash(6010)--pstree(9378)| -less(9379)从结果可以看到所有进程由init派生而来2679为sshd系统服务5997和6009为sshd为work当前终端分配的一个session6010为基于这个session的、为work用户提供交互操作的shell进程由于包含管道命令9378和9379为6010的子进程即6010(bash)进程spawn了两次。其中当键入pstree | less 时shell先分析pstree是否为非内建命令或别名结果是外部命令需要在子进程中执行之故另启动一个进程(9378)去执行pstree命令同样less也按照上述方法执行。2. 例1的延续再来看下如果调用sh脚本系统如何表现脚本示例#! /bin/bashping 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: workpts/0work 5144 5143 0 08:52 pts/0 00:00:00 -bashwork 10252 5144 0 09:07 pts/0 00:00:00 sh test.shwork 10253 10252 0 09:07 pts/0 00:00:00 ping 127.0.0.1work 10254 10252 0 09:07 pts/0 00:00:00 tail -fwork 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。