SHELL中的非同步執行
阿新 • • 發佈:2019-01-01
非同步執行
有時我們希望同時執行多項任務,這其中涉及到父指令碼以及多個子指令碼的載入問題,子指令碼可以在父指令碼執行時執行其他額外的任務。但是,當一系列指令碼以這種方式執行時,保證父指令碼與子指令碼的協調一致就會是一個問題。試想下這樣一種情況,如果父指令碼與子指令碼互相依賴,一個指令碼必須等待另一個指令碼任務完成才能繼續自己的任務。
針對以上情形,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)已啟動
父指令碼:繼續執行中..
子指令碼:正在執行..
父指令碼:暫停執行,等待子指令碼執行完畢..
子指令碼:子指令碼結束。指令碼退出!
父指令碼:子指令碼已結束,父指令碼繼續..
父指令碼:父指令碼執行結束。指令碼退出!