bash - programa - script linux ejemplos
¿Cómo puedo ejecutar una lista de comandos en paralelo? (3)
Tengo un archivo que contiene las líneas de comandos que quiero ejecutar. Este archivo contiene alrededor de 2,000 líneas.
Tengo 8 núcleos disponibles. ¿Es posible analizar el archivo e iniciar 8 procesos, y luego ejecutar otro desde el archivo cada vez que uno de los programas termina? Quiero que esto continúe hasta que se llegue al final del archivo.
Puede usar xargs para leer en el archivo, al tiempo que limita la cantidad máxima de procesos a la cantidad de núcleos disponibles. Por ejemplo:
cores=$(fgrep -c processor /proc/cpuinfo)
xargs --arg-file=/tmp/foo /
--max-procs=$cores /
--replace /
--verbose /
/bin/sh -c "{}"
Puede iniciar nuevos procesos en segundo plano simplemente ejecutando un comando con &. Aquí hay un ejemplo que describe una solución a tu problema.
Use GNU paralelo . Es una herramienta increíblemente poderosa y existen paquetes oficiales para unas 20 distribuciones linux. ¿Que es eso? ¿Tienes una excusa de por qué no puedes usarlo? Aquí hay un ejemplo simple que muestra cómo ejecutar una lista o un archivo de comandos en paralelo:
Contenido de jobs.txt
:
sleep 1; echo "a"
sleep 3; echo "b"
sleep 2; echo "c"
Mando:
time parallel :::: jobs.txt
Resultados:
a
c
b
real 0m3.332s
user 0m0.170s
sys 0m0.037s
Notas:
Si desea mantener el orden igual que la entrada, pase el indicador -k
al paralelo GNU.
Si tiene más de ocho núcleos y solo desea procesar con ocho núcleos, agregue -j 8
a la lista de argumentos.
La página de manual es una buena lectura, pero si aún no has leído este tutorial, te recomiendo encarecidamente la inversión de tiempo.