Bash脚本与卷曲操作并行

时间:2013-11-15 15:48:48

标签: bash curl gnu-parallel

我有一个带有url的列表,我喜欢用CURL加载,并使用bash脚本对结果执行一些操作。 由于它几乎是100k的请求,我喜欢并行运行它。 我已经研究过GNU parallel,但是我怎么把它们粘在一起呢?谢谢!

bashscript:

while read URL; do
curl -L -H "Accept: application/unixref+xml" $URL > temp.xml;

YEAR=$(xmllint --xpath '//year' temp.xml);
MONTH=$(xmllint --xpath '(//date/month)[1]' temp.xml);

echo "$URL;$YEAR;$MONTH" >> results.csv;

sed -i '1d' urls.txt;

done < urls.txt;

1 个答案:

答案 0 :(得分:2)

在发出每个HTTP请求时,不应修改URL的输入列表。并且让多个appender从不同进程写入相同的输出文件可能会以泪流满面。

将大多数命令放在一个单独的脚本(名为geturl.sh)中,该脚本可以使用URL作为参数调用,并将其输出行写入标准输出:

#!/usr/bin/env bash
URL="${1}"
curl -L -H "Accept: application/unixref+xml" "${URL}" > /tmp/$$.xml
YEAR="$(xmllint --xpath '//year' /tmp/.xml)"
MONTH="$(xmllint --xpath '(//date/month)[1]' /tmp/$$.xml)"
rm -f /tmp/$$.xml
echo "${URL};${YEAR};${MONTH}"

然后调用如下(这里我们让parallel逐行合并各个线程的输出):

parallel --line-buffer geturl.sh < urls.txt > results.csv