2017-10-06 39 views
3

我有以下while循環並行運行。 (該logProcess就是我前面在我的腳本中定義的功能。)如何在bash中並行循環?

while read LINE; do 
    logProcess $LINE & 
done <<< "$ELS_LOGS" 
wait 

我需要找到一種方法來限制運行的進程數。我知道有並行進程正在運行。如何轉換循環以使用該命令?

+0

也許在循環內部,您可以檢查ps -ef和grep * log *過程並檢查行數[wc -l]。如果這超過了要運行的進程數,則可以休眠一段時間,直到其中一個進程已完成,然後再次啓動新的logProcess。 那是什麼要求? –

+0

'logProcess $ LINE',而不是'logProcess「$ LINE」'?請記住,如果你有一行包含'*'的行,你會得到放在命令行上的文件名列表。 –

回答

2

我可以向你推薦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 ... 
+0

該腳本包含更多功能,不能像上面那樣運行。理想情況下,我需要平行化循環部分。 –

+0

不知道我明白 - 我的建議與你所要求的相同。你的問題不代表你想要什麼? –

+0

@MatthewBullock,如果你的函數調用其他函數,*也導出其他函數*。相反,如果你的函數需要修改全局共享狀態,那麼你有一個你不能在shell中執行的工作(不使用磁盤或其他外部存儲進行協調):Shell不支持線程(如果你有多個線程共享相同變量狀態的執行);相反,所有*它的選項都是多處理風格,其中每個子進程都有自己的變量,工作目錄等。 –

1

GNU xargs也是這項工作的適當工具:

xargs -P 20 -d $'\n' -n 1 logProcess 

...會運行多達20個併發logProcess實例,將stdin的每一行都傳遞給xargs傳遞給另一個此類實例。