2010-05-07 29 views
17

que tienen una secuencia de comandos shell C que hace algo como esto:¿Cómo usar la ejecución paralela en un script de shell?

#!/bin/csh 
gcc example.c -o ex 
gcc combine.c -o combine 
ex file1 r1  <-- 1 
ex file2 r2  <-- 2 
ex file3 r3  <-- 3 
#... many more like the above 
combine r1 r2 r3 final 
\rm r1 r2 r3 

¿Hay alguna manera de que pueda hacer líneas 1, 2 y 3 de ejecución en paralelo en lugar de una después de la otra?

Respuesta

13

Convierta esto en un Makefile con las dependencias apropiadas. Luego puede usar make -j para hacer que Run funcione todo en paralelo.

Tenga en cuenta que todas las sangrías en un Makefile deben ser TAB. TAB muestra dónde están los comandos para ejecutar.

También tenga en cuenta que este Makefile ahora usa extensiones GNU Make (las funciones comodín y subst).

Se podría tener este aspecto:

export PATH := .:${PATH} 

FILES=$(wildcard file*) 
RFILES=$(subst file,r,${FILES}) 

final: combine ${RFILES} 
    combine ${RFILES} final 
    rm ${RFILES} 

ex: example.c 

combine: combine.c 

r%: file% ex 
    ex $< [email protected] 
+0

Su '-l combine' debe ser '-o combine' – SiegeX

+0

¿Pondría la regla' final' primero para que sea el ¿defecto? –

+0

¿Qué estaba pensando? Fijo. –

7

En bash lo haría;

ex file1 r1 & 
ex file2 r2 & 
ex file3 r3 & 
wait 
... continue with script... 

y engendrar que funcionen en paralelo. Puede check out this SO thread para otro ejemplo.

4
#!/bin/bash 

gcc example.c -o ex 
gcc combine.c -o combine 

# Call 'ex' 3 times in "parallel" 
for i in {1..3}; do 
    ex file${i} r${i} & 
done 

#Wait for all background processes to finish 
wait 

# Combine & remove 
combine r1 r2 r3 final 
rm r1 r2 r3 

que altera ligeramente el código para utilizar la expansión de llaves {1..3} en lugar de codificar los números ya que me di cuenta de que ha dicho que hay muchos más archivos que acaba de expansión 3. Brace hace escalar a un mayor número trivial mediante la sustitución del ' 3 'dentro de las llaves al número que necesites.

1

puede utilizar cmd & y esperar después

 
#!/bin/csh 
echo start 
sleep 1 & 
sleep 1 & 
sleep 1 & 
wait 
echo ok 

prueba:

 
$ time ./csh.sh 
start 
[1] 11535 
[2] 11536 
[3] 11537 
[3] Done     sleep 1 
[2] - Done     sleep 1 
[1] + Done     sleep 1 
ok 

real 0m1.008s 
user 0m0.004s 
sys 0m0.008s 
0

paralelo GNU haría bastante como:

seq 1 3 | parallel ex file{} r{} 

Dependiendo de cómo 'ex 'y' combinar 'trabajo que incluso puede hacer:

seq 1 3 | parallel ex file{} | combine 

Más información sobre GNU paralelo al ver http://www.youtube.com/watch?v=LlXDtd_pRaY

1

Usted podría utilizar nohup ejemplo:

nohup ex file1 r1 &  
nohup ex file2 r2 & 
nohup ex file3 r3 & 
0

xargs puede hacerlo:

seq 1 3 | xargs -n 1 -P 0 -I % ex file% r%

-n 1 es para "una línea por entrada", -P es para "ejecutar cada línea en paralelo"

Cuestiones relacionadas