簡體   English   中英

並行運行兩個shell腳本並捕獲它們的輸出

[英]Run two shell script in parallel and capture their output

我想要一個shell腳本,它配置幾個東西,然后調用另外兩個shell腳本。 我希望這兩個腳本並行運行,我希望能夠獲取並打印它們的實時輸出。 這是我的第一個腳本,它調用另外兩個

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

這兩個過程嘗試部署兩個不同的應用程序,每個過程大約花費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將錯誤消息重定向到相關的輸出文件
  • &在行的末尾導致主腳本在分叉后繼續運行,從而產生一個與主腳本的其余部分同時執行腳本行的子代
  • 每個腳本應將其輸出發送到單獨的文件。 將兩個發送到同一文件將在視覺上混亂,並且當實例生成類似的輸出消息時無法進行排序。
  • 您可以嘗試在腳本與任何閱讀器一起運行時讀取輸出文件,例如less instance1.out但是輸出可能會卡在緩沖區中而不是最新的。 要解決這個問題,程序必須以行緩沖或非緩沖模式打開stdout。 您還可以使用-f>來刷新顯示。

來自Apache Spark和我博客上的並行處理文章中的 示例D提供了類似的shell腳本,用於計算所有內核上的Pi系列的總和,給出了用於計算一個內核上的和的C程序。 這有點超出了問題的范圍,但我提到它,以防你想看到更深層的例子。

這很可能,將腳本更改為如下所示:

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

它們都將輸出到同一個文件,您可以通過運行來查看該文件:

    tail -f script.log

如果您願意,可以根據需要輸出2個不同的文件。 只需將每個ling更改為輸出(>>)到第二個文件名。

這就是我最后使用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

我在兩個進程中的日志不同,所以我不在乎是不是全部在一起,這就是我將它們全部放在一個文件中的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM