curl 命令中的 Bash 脚本多线程

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)

如果我正常运行,它会处理所有请求,但速度非常低。有没有办法保持速度并且不会错过所有请求。

Ole*_*nge 9

您遇到了并行附加到文件的问题。简单的答案是:不要。

以下是使用 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)