2013-11-27 70 views
2

我試圖確保命令在並行命令終止後以串行方式運行。在Bash中完成先前作業時執行命令(僅限)

command1 & 
command2 & 
command3 

在上述例子中,command1command2在背景的同時推出,但command3之後立即運行。我知道這是Bash的預期行爲,但我想知道是否在command1command2終止之後有一個command3的啓動方式。

這可能是可以這樣做:

(command1; touch done1) & 
(command2; touch done2) & 
while [ ! -f done1 ] && [ ! -f done2 ]; do sleep 1000; done 
command3 

...但如果一個更優雅的解決方案可我會抓住。因爲這些命令註定要在PBS隊列中使用,所以加入需要被動。有任何想法嗎?提前致謝。

回答

2

您可以使用wait沒有參數等待所有以前的作業完成:

command1 & 
command2 & 
wait 
command3 
+0

感謝您的快速答覆!這會做到這一點。爲了推動它,但進一步,我想要的東西像'((command1&; command2&; wait; command3)&;(commandA&; commandB&; wait; commandC)&)'表現爲第一個等待'是依賴'command1'和'command2',第二個'wait',只在'commandA'和'commandB'上,我需要指定作業ID到'wait'? –

+1

這很符合你的想法。 'wait'只等待當前shell中的命令。 '(..)'創建一個子shell,所以'a&(b&(等待)'將只等待'b'。另外,'&;'是無效的;只需使用&&。 –

+1

可能有用提到'jobs'命令會給出正在運行的作業列表 - 'jobs -p'只給出pid。 – bryn