Shell

結合併行和順序命令

  • March 1, 2018

一、總結

我不明白,如何在 Linux 中組合併行和順序命令。


  1. 預期行為

虛擬碼

pip install pipenv 順序的 pipenv install --dev

並行任務

npm install -g grunt-cli 順序的 npm install

Windows 批處理等效

start cmd /C "pip install pipenv & pipenv install --dev"
start cmd /C "npm install -g grunt-cli & npm install"

3.沒有幫助

  1. 我不認為,&並且wait可以解決這個問題,請參閱rsaw 評論
  2. 我讀到,GNU 並行 - 是並行任務的更好方法,但我找不到,我需要在GNU 並行中使用哪種語法來解決這個任務。
  3. 我嘗試並行外殼
parallelshell "pip install pipenv && pipenv install --dev" "npm install -g grunt-cli && npm install"

完整.sh文件:

git clone --depth 1 https://github.com/Kristinita/KristinitaPelican
wait
cd KristinitaPelican
wait
parallelshell "pip install pipenv && pipenv install --dev" "npm install -g grunt-cli && npm install"

但起初pipenv install --dev命令為我執行,然後npm install. 它是順序的,而不是並行的。

只需使用 GNU parallel

parallel ::: 'pip install pipenv && pipenv install --dev' \
            'npm install -g grunt-cli && npm install'

Windows 命令的 Unix 風格等價物如下:

(pip install pipenv && pipenv install --dev) >& pip.log &
(npm install -g grunt-cli && npm install) >& npm.log &

這將在後台啟動兩個子 shell,一個執行pip後跟pipenv(如果pip完成沒有錯誤),另一個執行兩個npm命令。兩組命令的輸出都被重定向到日誌文件,以保持事情的可理解性。

如果您需要等待所有這些命令完成後再繼續,請使用

wait

正如你已經發現的那樣。

當使用 POSIX 樣式的 shell 對任務進行排序和並行化時,有兩種工具可供您使用:

  • 作業控制,它允許您將任務放在後台(&在命令末尾使用),並允許您等待它們完成(使用wait
  • 子外殼,它允許您以任何您喜歡的方式拆分處理單元,包括需要按順序處理的序列化任務。

這對於簡單的需求(例如您目前的任務)來說已經足夠了,並且可以讓您走得很遠。對於更複雜的案例,存在更高級的工具;GNU Parallel 就是其中之一,如果您需要更好的資源控制,也值得研究批處理工具。

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