Bash

呼叫多個 bash 腳本並並行執行它們,而不是按順序執行

  • April 4, 2021

假設我有三個(或更多)bash 腳本:script1.shscript2.shscript3.sh. 我想呼叫所有這三個腳本並並行執行它們。一種方法是只執行以下命令:

nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &

(一般來說,腳本可能需要幾個小時或幾天才能完成,所以我想使用nohup它們以便即使我的控制台關閉它們也能繼續執行。)

但是,有沒有辦法在一次呼叫中並行執行這三個**命令

我在想類似的東西

nohup bash script{1..3}.sh &

但這似乎按順序執行script1.shscript2.sh而不是並行執行。script3.sh

for((i=1;i<100;i++)); do nohup bash script${i}.sh & done

更好的方法是使用GNU Parallel。GNU 並行很簡單,使用它我們可以控制並行執行的作業數量,並對作業進行更多控制。

在下面的命令中,script{1..3}.sh被擴展並作為參數bash並行發送。這裡-j0表示應該執行盡可能多的作業。預設情況下parallel,為一個 cpu 核心執行一項作業。

$ parallel -j0 bash :::: <(ls script{1..3}.sh)

你也可以嘗試使用

$ parallel -j0 bash ::: script{1..3}.sh

在執行第二種方法時,如果您收到任何錯誤消息,則表示該--tollef選項已設置/etc/parallel/config,需要刪除,一切都會正常工作。

您可以在此處閱讀GNU Parallels手冊頁以獲得更豐富的選項。

如果您正在從遠端電腦執行作業,請更好地使用screen,以免會話因網路問題而關閉。nohup沒有必要,因為最新版本的 bash 與huponexitas一起提供off,這將阻止父 shellHUP在退出期間向其子 shell 發送信號。如果它沒有取消,請使用

$ shopt -u huponexit  

引用自:https://unix.stackexchange.com/questions/169326