1. 程式人生 > >SHELL中的非同步執行

SHELL中的非同步執行

非同步執行

有時我們希望同時執行多項任務,這其中涉及到父指令碼以及多個子指令碼的載入問題,子指令碼可以在父指令碼執行時執行其他額外的任務。但是,當一系列指令碼以這種方式執行時,保證父指令碼與子指令碼的協調一致就會是一個問題。試想下這樣一種情況,如果父指令碼與子指令碼互相依賴,一個指令碼必須等待另一個指令碼任務完成才能繼續自己的任務。

針對以上情形,bash提供了一個內建的命令來幫助管理非同步執行。wait命令可以讓父指令碼暫停,直到指定的程序(比如子指令碼)結束。

wait命令

下面通過兩個例子,演示wait命令的使用:

#!/bin/bash

#
# 非同步執行(wait)使用樣例-父指令碼
# echo "父指令碼:啟動子指令碼.." ./async-child & # 通過將shell引數 $! 賦給pid變數,以記錄子程序的程序ID pid=$! echo "父指令碼:子指令碼(PID=${pid})已啟動" echo "父指令碼:繼續執行中.." sleep 2 echo "父指令碼:暫停執行,等待子指令碼執行完畢.." wait ${pid} echo "父指令碼:子指令碼已結束,父指令碼繼續.." echo "父指令碼:父指令碼執行結束。指令碼退出!"

下面是子指令碼:

#!/bin/bash

#
# 非同步執行(wait)使用樣例-子指令碼
# echo "子指令碼:正在執行.." sleep 5 echo "子指令碼:子指令碼結束。指令碼退出!"

指令碼執行,產生如下輸出:

[fbap:/home/fbap/usertmp]>./async-parent.sh
父指令碼:啟動子指令碼..
父指令碼:子指令碼(PID=42620)已啟動
父指令碼:繼續執行中..
子指令碼:正在執行..
父指令碼:暫停執行,等待子指令碼執行完畢..
子指令碼:子指令碼結束。指令碼退出!
父指令碼:子指令碼已結束,父指令碼繼續..
父指令碼:父指令碼執行結束。指令碼退出!