3

Вот простой 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 < $1

Я читаю URL из текстового файла, но он обрабатывает только по одному за раз, что занимает слишком много времени, параллельный GNU и xargs также обрабатывают одну строку за раз (проверено)

Как обработать одновременный URL для обработки, чтобы улучшить время? Другими словами, многопоточность URL-файла, а не команд bash (что делают GNU параллельно и xargs)

как ответ от пользователя, этот код работает нормально, за исключением того, что он не обрабатывает последний URL

urlstatus=$(curl -o /dev/null --silent --head --write-out  '%{http_code}' "${url}" --max-time 5 ) && echo "$url  $urlstatus" >> urlstatus.txt &

может быть добавление ждать помощи ,, какие-либо предложения

2 ответа2

3

В 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 &
1

Параллельно 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 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .