在 bash 中多次读取 txt 文件(线程)

Multiple read from a txt file in bash (threading)

这是一个简单的bash HTTP 状态代码脚本

 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 < 

我正在从文本文件中读取 URL 但它一次只处理一个,花费太多时间,GNU 并行和 xargs 也一次处理一行(已测试)

如何同时处理 URL 处理以改善时序?换句话说 URL 文件的线程而不是 bash 命令(GNU 并行和 xargs 做的)

Input file is txt file and lines are separated  as
ABC.Com
Bcd.Com
Any.Google.Com
Something  like this

    #!/bin/bash
while read LINE; do
  curl -o /dev/null --silent --head --write-out '%{http_code}' "$LINE" & echo
  echo " $LINE"
done < url-list.txt

您正在逐行读取文件并将该行传递给正在获取内容的 curl,然后当 CURL 完成时它将读取新行。所以为了避免你需要添加 & echo

一个糟糕的例子:

file="/tmp/url-list.txt"
echo "hello 1" >>$file 
echo "hello 2" >>$file
echo "hello3" >>$file 
while read line ;do 
  sleep 3 && echo "i run after sleep 3 - $line"  & echo "i runn as the same time of sleep 3"
done< "$file"

你提到你在 GNU parallel 上运气不佳。也许试试这个方法?

format='curl -o /dev/null --silent --head --write-out "%{http_code}" "%s"; echo "%s"\n'

awk -v fs="$format" '{printf fs, [=10=], [=10=]}' url-list.txt | parallel

想要例如128 个并发进程?

awk -v fs="$format" '{printf fs, [=11=], [=11=]}' url-list.txt | parallel -P128

GNU parallel and xargs also process one line at time (tested)

你能举个例子吗?如果您使用 -j 那么您应该能够 运行 一次处理多个进程。

我会这样写:

doit() {
    url=""
    urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 )
    echo "$url  $urlstatus"
}
export -f doit
cat "" | parallel -j0 -k doit >> urlstatus.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