Многократное чтение из txt-файла в bash (параллельная обработка)
Вот простой 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 ответа
В 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 &
Параллельно 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