於 Linux 想要多工、同時非同步執行, 一般都會寫 Thread、Fork 或者利用 & 等等來做, 有沒有偷懶的方法, 可以直接把參數丟給程式後, 自動平行產生多個 Process 來處理呢?
- Linux 可以安裝 xjobs 來使用看看: apt-get install xjobs
- xjobs is most useful on multi-processor/core machines when one needs to execute several time consuming command several that could possibly be run in parallel.
- xjobs - construct command line and execute jobs in parallel
註: Linux 還有 parallel 可以達成類似的事情.
使用 xjobs 同時平行多工的執行程式
xjobs 使用方式很簡單, 把參數寫在檔案裡面, 用 "\n"(斷行)分隔, 再 cat 出來丟給 xjobs 即可, 如下範例:
- vim arglist.txt # 產生下述內容
1
2
3 - cat arglist.txt | xjobs -j 3 touch # -j 同時開啟3個 Process(processors) 來處理, 分別會執行:
touch 1
touch 2
touch 3 - ls # 會產生 1, 2, 3 三個檔案
xjobs 使用範例
- ls -1 *.zip | xjobs unzip
- ls -1 *.zip | xjobs -n unzip
- find . -name '*.bak' | xjobs gzip
- ls -1 *.jar | sed 's/\(.*\)/\1 > \1.idx/' | xjobs jar tf
- ls -1 *.mp3 | sed 's/\(.*\)\.mp3/"\1.mp3" > "\1.wav"/' | xjobs -- mpg123 -s
- find -name '*wav' | xjobs oggenc
- xjobs -s ./example.sh
- cat filelist.txt | xjobs ./process.php # 把檔案列表丟進 process.php 處理.
- cat domain-list | xjobs -j 3 ./whois.php # 把 Domain name 丟進 whois 查詢.
- cat filenewline.txt | xjobs -j 3 -1 ./process.php # 依照換行分隔每個參數丟入執行