0

我有一个解析日志文件的 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

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

4

1 回答 1

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 "$@"' _
于 2019-02-08T16:01:10.787 回答