2017-01-16 4 views
1

Вот простой Баш скрипт для кода состояния HTTPMultiple чтения из текстового файла в Баше (резьб)

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 файла, а не Баш команд (которые GNU параллельно и xargs сделать)

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

.

+2

Чтение строки из файла не занимает времени. 'cURL' занимает время ... Посмотрите, работает ли' curl' в качестве фонового процесса для вас. – anishsane

+0

Это то, что я часто делаю с 'parallel'. если вы показываете, что вы пытались с помощью 'parallel' и' xargs', может быть, кто-то найдет небольшую проблему с исправлением. – webb

ответ

0

GNU параллельно и 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 "$1" | 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 
+0

Я делаю как cat any.txt | parallel - j100/bash. Sh filelist.txt – user7423959

+0

и n1 также проверены – user7423959

+0

Ahh, что и объясняет. Рассмотрите возможность прохода через 'man parallel_tutorial'. Это объяснит это и даст вам лучшее представление о том, почему оно работает так, как оно есть. –

0
#!/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 закончил он будет читать новую строку. Таким образом, чтобы избежать, что вам нужно сделать добавить & эхо

неприятный пример:

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" 
1

вы упомянули вы не имели удачи с GNU parallel. возможно, попробуй?

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

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

want e.g. 128 одновременных процессов?

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

спасибо, это правда. исправлено. – webb

Смежные вопросы