2010-03-07 42 views

回答

44

是的,如果你什麼也不做,然後在bash腳本命令序列化。你可以告訴bash運行一束平行的命令,然後等待他們全部完成,但做這樣的事情:

command1 & 
command2 & 
command3 & 
wait 

在每個前三行的末尾的&符號告訴Bash在後臺運行該命令。第四個命令wait告訴bash等待所有子進程退出。

請注意,如果您這樣做,您將無法獲得子命令的退出狀態(並且set -e將不起作用),因此您將無法判斷它們是成功還是失敗以通常的方式。

bash manual有更多的信息(搜索wait,約下降三分之二)。

+3

您可以_can_實際捕獲進程的返回狀態。使用'$!'獲取每個命令的pid,將它們保存在一個數組中,然後遍歷該數組,調用'wait pid; echo $?'爲每個pid。 –

1

一般來說,除非明確地發送到後臺或將自己作爲守護進程退出,否則shell腳本中的命令將被序列化。

1

他們等到前一個完成。 但是,您可以編寫2個腳本並在不同的進程中運行它們,以便它們可以同時執行。這真是一個瘋狂的猜測,但是我認爲如果一個進程試圖寫入正被另一個進程讀取的文件,你會得到一個訪問錯誤。

3

除非您明確告訴bash在後臺啓動進程,否則它將等待進程退出。所以如果你這樣寫:

foo args & 

bash將繼續而不用等待foo退出。但是如果你沒有明確地把進程放在後臺,bash會等待它退出。

從技術上講,一個過程可以通過分出孩子然後退出來有效地將自己置於背景中。但由於這種技術主要用於長壽命過程,所以這不會影響到你。

9

在命令的末尾添加'&'以並行運行。 但是,這很奇怪,因爲在你的情況下,第二個命令取決於第一個命令的最終結果。無論是使用順序命令或複製到B和C從這樣的:

cp /tmp/a /tmp/b & 
cp /tmp/a /tmp/c & 
+4

+1:關於複製到/ tmp/b然後將/ tmp/b複製到/ tmp/c的問題的好處! –

+2

這僅僅是一個人爲的例子(: – corydoras

+2

這很清楚,我的觀點是在並行化相關命令時要小心:) –

相關問題