2012-07-14 73 views
11

Tengo un archivo que contiene líneas de comando que quiero ejecutar. Este archivo contiene alrededor de 2,000 líneas.¿Cómo puedo ejecutar una lista de comandos en paralelo?

Tengo 8 núcleos disponibles. ¿Es posible analizar el archivo e iniciar 8 procesos, y luego ejecutar otro desde el archivo cada vez que finalice uno de los programas? Quiero que esto continúe hasta que se llegue al final del archivo.

+0

Consulte [Gestión de procesos] (http://mywiki.wooledge.org/ProcessManagement). –

Respuesta

18

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 "{}" 
+1

La mejor solución –

0

Puede iniciar nuevos procesos en segundo plano simplemente ejecutando un comando con &. Hay un ejemplo here que describe una solución a su problema.

28

Use GNU parallel. Es una herramienta increíblemente poderosa y existen paquetes oficiales para unas 20 distribuciones linux. ¿Que es eso? You have an excuse as to why you can't use it? Aquí está un ejemplo simple que muestra cómo ejecutar una lista o archivo de comandos en paralelo:

Contenido de jobs.txt:

sleep 1; echo "a" 
sleep 3; echo "b" 
sleep 2; echo "c" 

de comando:

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.

El man page es una buena lectura, pero si aún no ha leído this tutorial, le recomiendo encarecidamente la inversión de tiempo.

+0

GNU parallel no está disponible en Ubuntu 11.10, pero está disponible en Debian sid. También vale la pena señalar que este ejemplo * no * funcionará como está con la utilidad paralela del paquete moreutils, que tiene una semántica diferente. –

+0

-j 8 no es necesario, se detecta automáticamente. Paquete de Ubuntu: https://build.opensuse.org/package/binaries?package=parallel&project=home%3Atange&repository=xUbuntu_11.10 –

+0

Para ejecutar comandos desde un archivo en paralelo, puede hacer 'cat/path/to/file .txt | paralelo' –

Cuestiones relacionadas