1. 程式人生 > >shell中後臺執行函式

shell中後臺執行函式

在shell中定義好的函式,執行的時候可以直接在腳本里面通過func &方式後臺執行。

一開始我很好奇為什麼shell腳本里面定義好的函式可以這麼用,通常我們在指令碼中都是以後臺方式執行其它的指令碼或者命令。

於是做了如下一個實驗:

new()
{   
     echo "func bkground pid by \$\$ is $$"
     while [ 1 == 1 ]
     do
           sleep 5
     done
}

echo "current script pid is $$"
new &
while [ 1 == 1 ]
do
    sleep 5
done

執行如上指令碼後,通過ps檢視會發現當前運行了兩個shell程序,輸出如下:

[[email protected] ~]# ps -ef|grep test
root     26960 30678  0 12:05 pts/0    00:00:00 sh test.sh
root     26961 26960  0 12:05 pts/0    00:00:00 sh test.sh
所以可以確認,shell裡面是可以直接以後臺方式執行函式的,後臺執行的函式以一個新的程序執行。

可是這個時候看一下指令碼的輸出,會發函式雖然以後臺方式在運行了,但是獲取到的當前程序id卻和主程序一樣:

[[email protected] ..]# sh test.sh 
current script pid is 26960
func bkground pid by $$ is 26960

分析原因,可能是因為新的程序繼承了主程序的環境變數,直接把$$也copy過來了,所以在新的程序裡面獲取到的程序id是和父程序一樣的。這個現象和fork()很類似,於是google了一下,網上有人問到shell裡面是否有類似於c函式fork的實現,下面的回答就是用&。

所以這個後臺執行的函式程序,應該是直接copy的主程序的環境變數,導致在函式程序裡面通過$$獲取到的程序id是錯的。

最後在分享一個小技巧,在shell裡面如果以後臺的方式執行一個程式碼片段,前提是不定義函式,實現方式是:

{ ....

  ....

} &