linux shell 脚本 父子进程 等待子进程,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
&,提交后臺作業
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當前終端分配的一個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。
總結
以上是生活随笔為你收集整理的linux shell 脚本 父子进程 等待子进程,SHELL父子进程分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《寻人大师》剧情播出时间介绍 根据什么故
- 下一篇: linux自动启动network服务,W