使用 xargs 進行並行處理
我將如何為每一行並行執行一個 bash 腳本?實際上,我將跟踪日誌文件,並且對於找到的每一行,我想在後台執行一個腳本;類似於下面的範例:
tailf logfile.log | grep 'patternline' | while read line ; do bash scriptname.sh "$line" & ; done
我想知道如何使用xargs(或任何其他合適的方法)並行執行上述任務,以及如何限制程序。
提前致謝。
您想閱讀
xargs
手冊並查找其中的-L
和-P
標誌。tail -f logfile.log | grep 'patternline' | xargs -P 4 -L 1 bash scriptname.sh
這將一次最多執行四個命令實例 (
-P 4
),並且每次呼叫都使用一行輸入 (-L 1
)。添加
-t
到xargs
以查看執行的內容。
GNU Parallel 將為您正確引用參數:
tail -f logfile.log | grep 'patternline' | parallel bash scriptname.sh
最重要的是,它將預設為每個 CPU 核心 1 個程序,它將確保兩個並行作業的輸出不會混合。
GNU Parallel 是一個通用的並行化器,可以輕鬆地在同一台機器上或在您可以通過 ssh 訪問的多台機器上並行執行作業。它通常可以替換
for
循環。如果您想在 4 個 CPU 上執行 32 個不同的作業,那麼並行化的直接方法是在每個 CPU 上執行 8 個作業:
GNU Parallel 會在完成後生成一個新程序 - 保持 CPU 處於活動狀態,從而節省時間:
安裝
如果沒有為您的發行版打包 GNU Parallel,您可以進行個人安裝,這不需要 root 訪問權限。這樣做可以在 10 秒內完成:
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \ fetch -o - http://pi.dk/3 ) > install.sh $ sha1sum install.sh | grep 883c667e01eed62f975ad28b6d50e22a 12345678 883c667e 01eed62f 975ad28b 6d50e22a $ md5sum install.sh | grep cc21b4c943fd03e93ae1ae49e28573c0 cc21b4c9 43fd03e9 3ae1ae49 e28573c0 $ sha512sum install.sh | grep da012ec113b49a54e705f86d51e784ebced224fdf 79945d9d 250b42a4 2067bb00 99da012e c113b49a 54e705f8 6d51e784 ebced224 fdff3f52 ca588d64 e75f6033 61bd543f d631f592 2f87ceb2 ab034149 6df84a35 $ bash install.sh
有關其他安裝選項,請參閱http://git.savannah.gnu.org/cgit/parallel.git/tree/README
學到更多
查看更多範例:http ://www.gnu.org/software/parallel/man.html
觀看介紹影片:https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
瀏覽教程:http ://www.gnu.org/software/parallel/parallel_tutorial.html
註冊電子郵件列表以獲得支持:https ://lists.gnu.org/mailman/listinfo/parallel