我有一个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
我想在后台为文件中的每个参数运行一个实例。
答案 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 _