日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux shell 脚本 父子进程 等待子进程,SHELL父子进程分析

發布時間:2023/12/1 linux 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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父子进程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。