2015-07-11 72 views
2

我想要一個shell腳本,它配置了幾件事情,然後調用另外兩個shell腳本。我希望這兩個腳本並行運行,並且希望能夠獲得並打印它們的實時輸出。 這裏是我這就要求其他兩個並行運行兩個shell腳本並捕獲它們的輸出

#!/bin/bash 
#CONFIGURE SOME STUFF 
$path/instance2_commands.sh 
$path/instance1_commands.sh 

這兩個過程嘗試部署兩個不同的應用和他們每個人花了大約5分鐘,從而我想並行運行它們,也看到他們的現場輸出,所以第一個腳本我知道他們在部署任務的位置。這可能嗎?

回答

5

並行運行這兩個腳本可以是這樣的:

#!/bin/bash 
#CONFIGURE SOME STUFF 
$path/instance2_commands.sh >instance2.out 2>&1 & 
$path/instance1_commands.sh >instance1.out 2>&1 & 
wait 

注:

  • wait暫停,直到孩子們,instance1instance2,完成
  • 2>&1在每一行重定向錯誤信息到相關輸出文件
  • & at一行的結尾會導致主腳本在分叉後繼續運行,從而產生一個正在執行腳本的該行並與主腳本的其餘部分同時運行的子腳本,每個腳本應將其輸出發送到單獨的文件。當兩個實例產生相似的輸出消息時,將兩者發送到相同的文件將會在視覺上變得混亂並且不可能整理出來。
  • 當腳本與任何閱讀器一起運行時,您可能會嘗試讀取輸出文件,例如,但是,輸出可能會卡在緩衝區中,而不是最新的。爲了解決這個問題,程序必須以行緩衝或無緩衝模式打開stdout。您也可以使用-f>刷新顯示。

實施例darticle on Apache Spark and parallel processing on my blog提供了用於給定的用於計算在一個核心之和的C程序計算在所有芯的一系列Pi的總和,一個類似的外殼腳本。這有點超出了問題的範圍,但我提到它以防萬一您想看到更深層次的例子。

1

這是非常可能的,改變你的腳本是這樣的:

#!/bin/bash 
    #CONFIGURE SOME STUFF 
    $path/instance2_commands.sh >> script.log 
    $path/instance1_commands.sh >> script.log 

他們都將輸出到同一個文件,你可以通過運行看該文件:

tail -f script.log 

如果您就像你可以輸出到2個不同的文件一樣。只需更改每個ling即可將(>>)輸出到第二個文件名。

+2

如果你想並行運行它們,你需要在末尾加一個和號(&):$ path/instance2_commands.sh >> script.log& –

+1

不要把它們都記錄到相同的地方文件。沒有輸出的協調。 – Paul

0

這就是我最終使用Paul指令編寫它的方法。

source $path/instance2_commands.sh >instance2.out 2>&1 & 
source $path/instance1_commands.sh >instance1.out 2>&1 & 
tail -q -f instance1.out -f instance2.out --pid $! 
wait 
sudo rm instance1.out 
sudo rm instance2.out 

我在兩個進程中的日誌是不同的,所以我不在乎是不是都在一起,這就是爲什麼我把它們全部放在一個文件中。

相關問題