shell脚本:在并行化bash脚本的命令下,Ubuntu Linux操作系统

问题描述:

我创建一个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

看一看Gnu parallel。它允许您只需对现有脚本进行小修改即可完成所需操作。

我用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[@]}) &