使用后台进程优化脚本以提高速度

时间:2015-12-09 06:33:24

标签: linux bash shell unix

所有

我有这个bash shell脚本项目我正在研究我在循环中运行多个进程以从文本中提取值。我觉得我可以使用& amp;运算符在后台运行进程。

事情是,我认为我有正确的代码来做我想做的事情,但是当我运行它时,只要我不使用&和花括号。在我调整效率之前,我想看看是否有人可以帮我指出正确的方向。

代码特别是:

while read line || [[ -n "$line" ]]; do

{ convert "$line" "$dotdec" "10"
convert "$line" "$dothex" "16"
convert "$line" "$dotoct" "8"
convert "$line" "$dotbin" "2"
convert "$line" "$bin" "2"
convert "$line" "$oct" "8"
convert "$line" "$hex" "16"
convert "$line" "$dec" "10" & }

done < $1

wait
echo -e "$values" | sort | uniq -d | sort -nr | head -1

谢谢!

3 个答案:

答案 0 :(得分:1)

替换

{ convert "$line" "$dotdec" "10"
convert "$line" "$dothex" "16"
convert "$line" "$dotoct" "8"
convert "$line" "$dotbin" "2"
convert "$line" "$bin" "2"
convert "$line" "$oct" "8"
convert "$line" "$hex" "16"
convert "$line" "$dec" "10" & }

done < $1

wait

通过

convert "$line" "$dotdec" "10" &
convert "$line" "$dothex" "16" &
convert "$line" "$dotoct" "8" &
convert "$line" "$dotbin" "2" &
convert "$line" "$bin" "2" &
convert "$line" "$oct" "8" &
convert "$line" "$hex" "16" &
convert "$line" "$dec" "10" &
wait
done < $1

答案 1 :(得分:1)

在您的示例中,您只需将最新的命令convert "$line" "$dec" "10" &放到后台。

如果需要在订单中执行所有命令,则可以使用&&操作链接所有命令,并将它们放入子流程中的后台。

( convert "$line" "$dotdec" "10" &&
convert "$line" "$dothex" "16" &&
convert "$line" "$dotoct" "8" &&
convert "$line" "$dotbin" "2" &&
convert "$line" "$bin" "2" &&
convert "$line" "$oct" "8" &&
convert "$line" "$hex" "16" &&
convert "$line" "$dec" "10" & )

这是另一个简单的例子,以下命令将在执行后不久返回。

for i in `seq 10`;do (sleep $i && echo sleep $i &);done

答案 2 :(得分:0)

根据@RedX建议,使用GNU parallel代码可能看起来像那样(假设扩展变量中没有空格):

while read line || [[ -n "$line" ]]; do

    echo convert "$line" "$dotdec" "10"
    echo convert "$line" "$dothex" "16"
    echo convert "$line" "$dotoct" "8"
    echo convert "$line" "$dotbin" "2"
    echo convert "$line" "$bin" "2"
    echo convert "$line" "$oct" "8"
    echo convert "$line" "$hex" "16"
    echo convert "$line" "$dec" "10"

done < $1 | parallel :::

这是使用parallel的最简单方法。默认情况下(或:::作为参数),parallel读取要从stdin运行的命令,并行运行它们,并等待它们完成。如果没有明确的-j选项,parallel将同时运行每个物理CPU /核心一个作业。如果存在任何具有非零状态的命令,parallel将指示退出状态为1。

作为替代方案,我经常将shell脚本转换为Makefile,然后可以使用make -j运行。虽然这需要更多工作,但它允许将更多高级shell命令放入Makefile,并且可以更好地控制错误处理。