Ejecutar instancias simultáneas de un comando dentro de un script de Shell

Ejecutar instancias simultáneas de un comando dentro de un script de Shell

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

información relacionada