Extrair todos os 300.000 URLs de uma só vez não é o ideal. Você pode achar mais útil extrair um pequeno número de URLs, verificá-las e extrair URLs diferentes.
Digamos que você atribua status 0 a URLs não verificados. Você quer mudar este status
para 200, 301, 404, 403, 401 e assim por diante e assim por diante.
Digamos que cada linha tenha um ID exclusivo, o que torna as coisas mais rápidas.
#!/bin/sh
NUM=10
RESULTS=/tmp/results.$$.$RANDOM.txt
# Select some rows, selecting ID and URL
# The URL may contain spaces or single quotes.
# I wouldn't trust double quotes; a ' grep -v '"' ' piped between
# the mysql --silent and the while could be advisable in this case.
echo "SELECT id, url FROM mytable WHERE status = 0 LIMIT $NUM;" \
| mysql --silent mydatabase \
| while [ -n "$ID" ]; do
read ID URL
if [ -n "$ID" ]; then
# Extract HTTP result code
CODE=' curl -s --head "$URL" | head -n 1 \
| grep "^HTTP/[01]\.[0-9] [1-9][0-9]*" \
| cut -f2 -d" " '
# If there is a code
if [ -n "$CODE" ]; then
if [ "$CODE" == "200" ]; then
echo "200"
else
echo "Not 200"
fi
# Prepare update
echo "UPDATE mytable SET status=$CODE WHERE id=$ID;" >> $RESULTS
else
# We might update this ID to a new status in order not to
# extract it again.
echo "UPDATE mytable SET status=666 WHERE id=$ID;" >> $RESULTS
fi
fi
done
# update database
mysql mydatabase < $RESULTS
# Remove temporary file
rm $RESULTS