2013-03-22 181 views
2

我創建一個bash腳本來無損壓縮JPEG和PNG文件,所以我用兩個包Ubuntu的下一個名爲jpegoptim使用OptiPNG。 A將使用2或4核處理器的腳本。我想使用我的CPU的全部容量。shell腳本:在並行化bash腳本的命令下,Ubuntu Linux操作系統

的問題是,使用OptiPNG不支持默認多線程(它僅使用一個CPU核),所以決定,我啓動2或4個並行處理更快來壓縮圖像。我已經將圖像文件分類到4個幾乎相同的數組(基於像素數量),現在我需要運行並行化的進程。

我試圖在命令末尾使用&字符並行化進程,但它不會並行執行作業。我不得不捕捉命令的輸出,所以我認爲問題是與$()結構。

+0

我不認爲bash有併發支持,但我可能是錯誤的。任何原因你不能使用完整的編程語言? – tjameson 2013-03-22 09:47:26

+1

util ['taskset'](http://linuxcommand.org/man_pages/taskset1.html)是你可能會研究的東西。雖然我必須說,如果我有限地使用它,我還沒有意識到很多好處。此外,術語「處理器親和力」可能會幫助您進行搜索。 – jedwards 2013-03-22 09:49:59

+0

@jedwards它與'&'字符配合得很好。謝謝你的幫助! – 2013-03-22 11:37:50

回答

3

看一看Gnu parallel。它允許您只需對現有腳本進行小修改即可完成所需操作。

2

我用taskset&命令解決了我的問題。感謝@jedwards

最終的代碼如下所示:

outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_1[@]}) & 
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_2[@]}) & 
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_3[@]}) & 
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_4[@]}) &