1. 程式人生 > >Shell腳本中的並發(轉)

Shell腳本中的並發(轉)

itl back inux round tao top 修改 spa blog

轉自http://blog.csdn.net/wangtaoking1/article/details/9838571

主要記錄一下Shell腳本中的命令的並發和串行執行。

默認的情況下,Shell腳本中的命令是串行執行的,必須等到前一條命令執行完後才執行接下來的命令,但是如果我有一大批的的命令需要執行,而且互相又沒有影響的情況下(有影響的話就比較復雜了),那麽就要使用命令的並發執行了。

看下面的代碼:

#!/bin/bash  
for(( i = 0; i < ${count}; i++ ))  
do  
        commands1  
done  
commands2

對於上面的代碼,因為每個commands1都挺耗時的,所以打算使用並發編程,這樣就可以節省大量時間了。

修改後的代碼如下:

#!/bin/bash  
for(( i = 0; i < ${count}; i++ ))  
do  
{  
        commands1  
}&  
done  
commands2

這樣的話commands1就可以並行執行了。 實質是將commands1作為後臺進程在執行,這樣主進程就不用等待前面的命令執行完畢之後才開始執行接下來的命令。

但是我的本來目的是讓commands1的這個循環都執行結束後,再用command2去處理前面的結果。如果像上面這樣寫的話,在commands1都還沒結束時就已經開始執行commands2了,得到了錯誤的結果。

再次修改代碼如下:

#!/bin/bash  
for(( i = 0; i < ${count}; i++ ))  
do  
{  
        commands1  
}&  
done  
wait  
commands2

上面這樣就可以達到預期的目的了,先是所有的commands1在後臺並行執行,等到循環裏面的命令都結束之後才執行接下來的commands2。

對於上面的代碼,如果count值特別大的時候,我們應該控制並發進程的個數,不然會影響系統其他進程的運行,甚至死機。

接下篇:Shell腳本中的並發(2)

參考:linux shell編程多線程和wait命令學習

Shell腳本中的並發(轉)