Permítanme comenzar diciendo que todavía estoy aprendiendo a ejecutar scripts en bash y no estoy al tanto de muchas cosas. Si me pierdo algo, no dudes en regañarme como quieras.
En adelante, estoy creando un script bash simple para ejecutar un ping a 2 hosts diferentes y generarlo en un archivo. Ya lo tengo cubierto y está funcionando. Por curiosidad, agregué en el script la fecha de salida después y antes de la impresión de la salida del ping, para saber cuánto tiempo tomó ejecutar el ping. Configuré el ping en un intervalo de 1 segundo, 10 pings, 2 hosts. Mi primera cita (fue hace mucho tiempo...) tenía las 14:36:20 como marca de hora. La segunda fecha (después del ping) tenía 14:36:40 como marca de hora.
Entonces, la fecha esperó a que finalizaran ambos pings. Esto significa que los pings se ejecutaron secuencialmente.
¿Puedo hacer que se ejecuten simultáneamente, de modo que dedique 10 segundos a ejecutar el script en lugar de 20 segundos?
Aquí viene el fragmento de mi guión:
date >> teste.txt
cat hosts.txt | while read output
do ping -c 10 -i 1 "$output" >> teste.txt
done
date >> teste.txt
Hay varias otras cosas que querré que haga este script, pero prometo que solo preguntaré si no puedo encontrar una respuesta satisfactoria en Barsa.
PD: hosts.txt es donde almaceno los hosts a los que quiero hacer ping.
Respuesta1
La redacción de tu pregunta es un poco difícil de entender, pero creo que buscas algo como:
command &
command &
wait
El script ejecutará los dos comandos en segundo plano y esperará la respuesta.
Sin embargo, en su caso, debe tener cuidado con la condición de carrera. Probablemente quieras enviar la salida de los comandos individuales a archivos temporales y luego incluirlos en el archivo principal, por lo que probablemente harías algo como:
command > "${tmp1}" &
command > "${tmp2}" &
wait
cat "${tmp1}" "${tmp2}" >> "${main}"
rm -f "${tmp1}" "${tmp2}"
Actualización: puedes probar xargs (p. ej.https://stackoverflow.com/questions/15755422/linux-bash-script-to-ping-multiple-hosts-simultaneamente)
Respuesta2
Con GNU Parallel puedes hacer esto:
date >> teste.txt
cat hosts.txt | parallel -j0 ping -c 10 -i 1 {} >> teste.txt
date >> teste.txt