Linux 於 Shell 不想寫程式,又想要程式可以平行處理,可以使用 parallel 來處理。
Linux 使用 parallel 來同時平行多工處理
Parallel 的程式簡介
- parallel - build and execute command lines from standard input in parallel
parallel 安裝步驟
- sudo apt install parallel
parallel 的功能非常多,建議先 man parallel 來查看,下面只有先列列範例參考看看:
- seq -w 0 100 | parallel -j 8 touch {}.txt
- seq -w 0 9999 | parallel -j 8 rm pict{}.jpg
- find . -name '.jpg' | parallel convert -geometry 120 {} {}_thumb.jpg
- find . -type d -name ".svn" -print | parallel rm -rf # 取代 xargs, find . -type d -name ".svn" -print | xargs rm -rf
- cat file.txt | parallel -j 8 --pipe -L 50000 import_script
- -j 8:並行 jobs 的數量,不想並行執行可以設為 1。若不加 -j,則預設為每個 CPU 執行一個 job
- --pipe:從 stdin 讀取, 再將 stdin 的資料分給各個jobs
- -L N: 一次最多讀取N行
使用 parallel 同時傳送命令到各台機器
- echo "command" | parallel --onall --slf servers.txt
- ex: echo "ls" | parallel --onall --slf servers.txt # servers.txt (w1.example.com, w2.example.com.. 一行一個 domain name)
- echo "grep QueryKeyword /var/log/apache2/access.log" | parallel –onall –slf servers.txt
使用 xargs 來平行處理(感謝 CHUNG TSAI)
- $ cat filename | xargs -P 8 touch # filename 內容是一行一行的東西,這個會 touch 出 filename 一行一行當檔名
# xargs -P 8
# 也可以這樣做;
# man xargs 裏面說
-P max-procs, --max-procs=max-procs
Run up to max-procs processes at a time; the default is 1.
嗯嗯,感謝指點~~
但是這樣子沒辦法解決一個process 要跑很久的問題吧?假如說我有一個簡單迴圈,就計算1-1000000萬的總和,就算用 xargs -P 8 ,實際上也只有用到一個core在運算。
請問有沒有方式可以把這個迴圈拆給8個核心去算?
不行唷,你得要自己先能把這運算拆開才可以~
map reduce的思想
類似,但是還是純手動~