这是一个用于 HTTP 状态代码的简单 bash 脚本
while read url
do
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "${url}" --max-time 5 )
echo "$url $urlstatus" >> urlstatus.txt
done < $1
我正在从文本文件读取 URL,但它一次只能处理一个,花费了太多时间,GNU parallel 和 xargs 也每次处理一行(已测试)
如何处理同时进行的 URL 以改善时间安排?换句话说,使用 URL 文件线程而不是 bash 命令(GNU parallel 和 xargs 就是这么做的)
根据用户的回答,此代码运行良好,只是它不处理最后一个 url
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "${url}" --max-time 5 ) && echo "$url $urlstatus" >> urlstatus.txt &
可能会添加等待帮助,,,任何建议
答案1
在 bash 中,您可以使用 & 符号在后台运行程序。示例
for i in {1..100..1}; do
echo $i>>numbers.txt &
done;
编辑:抱歉,但评论中对你问题的回答是错误的,所以我只是编辑了答案。关于代码的建议
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "${url}" --max-time 5 ) && echo "$url $urlstatus" >> urlstatus.txt &
答案2
GNU parallel 和 xargs 也一次处理一行(已测试)
你能举个例子吗?如果你使用,-j
那么你应该能够同时运行多个进程。
我会这样写:
doit() {
url="$1"
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "${url}" --max-time 5 )
echo "$url $urlstatus"
}
export -f doit
cat input.txt | parallel -j0 -k doit
根据input.txt:
Input file is txt file and lines are separated as
ABC.Com
Bcd.Com
Any.Google.Com
Something like this
www.google.com
pi.dk
我得到输出:
Input file is txt file and lines are separated as 000
ABC.Com 301
Bcd.Com 301
Any.Google.Com 000
Something like this 000
www.google.com 302
pi.dk 200
看起来是正确的:
000 if domain does not exist
301/302 for redirection
200 for success
我必须说,如果您提供的输入行确实是您实际使用的输入的一部分,我会感到有点惊讶。这些域都不存在,并且带有空格的域名可能永远不会存在:
Input file is txt file and lines are separated as
Any.Google.Com
Something like this
如果您没有从实际输入文件中提供输入,那么您真的应该这样做,而不是编造东西 - 特别是如果编造的东西与真实数据不相似。
编辑
调试为什么它对您不起作用。
请不要编写脚本,而是直接在终端中运行:
bash # press enter here to make sure you are running this in bash
doit() {
url="$1"
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "${url}" --max-time 5 )
echo "$url $urlstatus"
}
export -f doit
echo pi.dk | parallel -j0 -k doit
这应该给出:
pi.dk 200