如何从文件中获取参数以并行/后台方式运行bash脚本的多个实例?

时间:2019-02-08 15:54:30

标签: bash

我有一个bash脚本,用于分析日志文件-将数据汇总到AWK数组中-该文件将文件路径的一部分作为参数。它运行良好,我可以在后台手动运行多个实例。问题在于我无法弄清楚如何避免为列表中的每个参数手动调用脚本。

根据我放置&的位置,它要么串行运行实例,要么尝试一次运行所有作业(我不想再看到9999的平均负载)。

script.sh param1 &

script.sh param2 & ... #works fine 

script.sh < params.txt & ... #runs serially

在脚本中的各个位置放置&会产生一些不良后果。

hub=$1
while read date; do
    zgrep ^1 /logarchive/http/${hub}pr*/$date*.gz|\
    awk -F'[ ,]' '{print$34,$(NF-6),$6,$(NF-7)}'|\
    awk 'NR>1{bytesDown[$1 " " $2] += $3; bytesUp[$1 " " $2] += $4} END {for (i in bytesDown) print i, bytesDown[i], bytesUp[i]}'\
    > ${hub}.$date.txt
done < dates.txt

我想在后台为文件中的每个参数运行一个实例。

1 个答案:

答案 0 :(得分:0)

使用export -f导出函数,然后可以从xargs -P开始的shell中并行调用它;在下面的示例中,numjobs指示您要同时运行多少个日期。

myfunc() {
    date=$1
    zgrep ^1 "/logarchive/http/${hub}pr*/$date"*.gz | \
    awk -F'[ ,]' '{print$34,$(NF-6),$6,$(NF-7)}'    | \
    awk '
      NR>1{
        bytesDown[$1 " " $2] += $3
        bytesUp[$1 " " $2] += $4
      }
      END {
        for (i in bytesDown) print i, bytesDown[i], bytesUp[i]
      }
    ' >"${hub}.$date.txt"
}
export -f myfunc
numjobs=8

xargs -P "$numjobs" -n 1 bash -c myfunc _