use*_*959 5 bash curl multithreading
这是一个 shell 脚本,它使用域及其参数来查找状态代码。由于线程,这运行得更快,但错过了很多请求。
while IFS= read -r url <&3; do
while IFS= read -r uri <&4; do
urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
echo "$url $urlstatus $uri" >> urlstatus.txt &
done 4<uri.txt
done 3<url.txt
Run Code Online (Sandbox Code Playgroud)
如果我正常运行,它会处理所有请求,但速度非常低。有没有办法保持速度并且不会错过所有请求。
您遇到了并行附加到文件的问题。简单的答案是:不要。
以下是使用 GNU Parallel 的方法:
doit() {
url="$1"
uri="$2"
urlstatus=$(curl -o /dev/null --insecure --silent --head --write-out '%{http_code}' "${url}""${uri}" --max-time 5 ) &&
echo "$url $urlstatus $uri"
}
export -f doit
parallel -j200 doit :::: url uri >> urlstatus.txt
Run Code Online (Sandbox Code Playgroud)
GNU Parallel 默认对输出进行序列化,因此您不会从一个作业中获得与另一个作业的输出混合的输出。
GNU Parallel 使用--tag. 所以除非输出格式是固定的,否则我会这样做:
parallel --tag -j200 curl -o /dev/null --insecure --silent --head --write-out '%{http_code}' {1}{2} --max-time 5 :::: url uri >> urlstatus.txt
Run Code Online (Sandbox Code Playgroud)
它将提供相同的输出 - 只是格式不同。代替:
url urlstatus uri
Run Code Online (Sandbox Code Playgroud)
你得到:
url uri urlstatus
Run Code Online (Sandbox Code Playgroud)