我有以下while
循環並行運行。 (該logProcess
就是我前面在我的腳本中定義的功能。)如何在bash中並行循環?
while read LINE; do
logProcess $LINE &
done <<< "$ELS_LOGS"
wait
我需要找到一種方法來限制運行的進程數。我知道有並行進程正在運行。如何轉換循環以使用該命令?
我有以下while
循環並行運行。 (該logProcess
就是我前面在我的腳本中定義的功能。)如何在bash中並行循環?
while read LINE; do
logProcess $LINE &
done <<< "$ELS_LOGS"
wait
我需要找到一種方法來限制運行的進程數。我知道有並行進程正在運行。如何轉換循環以使用該命令?
我可以向你推薦GNU並行。你的整個腳本將變成:
parallel -a "$ELS_LOGS" logProcess
如果logProcess
是你的腳本中定義的函數,則需要先運行之前將其導出GNU並行,像這樣:
export -f logProcess
然後,如果你想要一次運行8個,你只需要:
parallel -j 8 -a "$ELS_LOGS" logProcess
如果你想看看它會做什麼,而不是真的做摹什麼:
parallel --dry-run ...
如果你想有一個進度條,或ETA:
parallel --eta ...
parallel --bar ...
該腳本包含更多功能,不能像上面那樣運行。理想情況下,我需要平行化循環部分。 –
不知道我明白 - 我的建議與你所要求的相同。你的問題不代表你想要什麼? –
@MatthewBullock,如果你的函數調用其他函數,*也導出其他函數*。相反,如果你的函數需要修改全局共享狀態,那麼你有一個你不能在shell中執行的工作(不使用磁盤或其他外部存儲進行協調):Shell不支持線程(如果你有多個線程共享相同變量狀態的執行);相反,所有*它的選項都是多處理風格,其中每個子進程都有自己的變量,工作目錄等。 –
GNU xargs
也是這項工作的適當工具:
xargs -P 20 -d $'\n' -n 1 logProcess
...會運行多達20個併發logProcess
實例,將stdin的每一行都傳遞給xargs
傳遞給另一個此類實例。
也許在循環內部,您可以檢查ps -ef和grep * log *過程並檢查行數[wc -l]。如果這超過了要運行的進程數,則可以休眠一段時間,直到其中一個進程已完成,然後再次啓動新的logProcess。 那是什麼要求? –
'logProcess $ LINE',而不是'logProcess「$ LINE」'?請記住,如果你有一行包含'*'的行,你會得到放在命令行上的文件名列表。 –