3 votos

Leer múltiples de un archivo txt en bash (procesamiento paralelo)

Aquí es un simple script de bash para el código de estado 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

Estoy leyendo URL de un archivo de texto, pero los procesos de sólo uno a la vez, tomar demasiado tiempo, GNU paralelo y xargs también el proceso de una línea de tiempo (probado)

Cómo el proceso simultáneo de URL para procesamiento para mejorar el tiempo? En otras palabras roscado de la dirección URL del archivo en lugar de comandos en bash (que GNU paralelo y xargs hacer)

como respuesta de usuario este código funciona bien, excepto que no proceso de último url

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

puede ser la adición de esperar ayuda ,,, alguna sugerencia

3voto

me_alok Puntos 84

En bash, se podría utilizar el & símbolo para ejecutar programas en segundo plano. Ejemplo

for i in {1..100..1}; do
  echo $i>>numbers.txt &
done;

EDIT: Lo siento pero la respuesta para su pregunta en el comentario es incorrecto, tan sólo edité la respuesta. Sugerencias wrt código

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

1voto

Ole Tange Puntos 1305

GNU paralelo y xargs también el proceso de una línea de tiempo (probado)

Puede dar un ejemplo de esto? Si utilizas -j , entonces usted debería ser capaz de correr mucho más que un proceso a la vez.

Me gustaría escribir algo como esto:

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

Basado en el 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

Tengo la salida:

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

Que se ve cerca de la derecha:

000 if domain does not exist
301/302 for redirection
200 for success

Debo decir que estoy un poco sorprendido si las líneas de entrada que usted ha proporcionado en realidad son partes de la entrada que se utilizan realmente. Ninguno de estos dominios de existir, y los nombres de dominio con espacios en los que probablemente nunca existirá jamás:

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

Si usted no ha dado entrada a partir de su entrada real, de archivo, usted realmente debe hacer que en vez de inventar cosas - especialmente si las cosas no se asemejan a los datos reales.

Editar

La depuración por eso no funciona para usted.

Por favor, no escribir una secuencia de comandos, pero se ejecutan directamente en la terminal:

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

Esto debería dar:

pi.dk  200

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: