unix - example - ¿Cómo utilizar la ejecución paralela en un script de shell?
shell scripting pdf (7)
Convertir esto en un Makefile con dependencias adecuadas. Luego puedes usar make -j
para que Make ejecute todo lo posible en paralelo.
Tenga en cuenta que todas las sangrías en un Makefile deben ser TABs. TAB muestra Make donde están los comandos para ejecutar.
También tenga en cuenta que este Makefile ahora está utilizando las extensiones Make de GNU (las funciones wildcard y subst).
Podría verse así:
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 $< $@
Tengo un script de shell C que hace algo como esto:
#!/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 hacer que las líneas 1
, 2
y 3
ejecuten en paralelo en lugar de una después de la otra?
En bash lo haría;
ex file1 r1 &
ex file2 r2 &
ex file3 r3 &
wait
... continue with script...
y los engendran para que corran en paralelo. Puedes ver este hilo SO para otro ejemplo.
GNU Parallel lo haría bonito como:
seq 1 3 | parallel ex file{} r{}
Dependiendo de cómo funcionen ''ex'' y ''combine'', incluso puedes hacer:
seq 1 3 | parallel ex file{} | combine
Para obtener más información sobre GNU Parallel, http://www.youtube.com/watch?v=LlXDtd_pRaY
Podrías usar nohup ex:
nohup ex file1 r1 &
nohup ex file2 r2 &
nohup ex file3 r3 &
puedes usar cmd y esperar despues
#!/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
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 "correr cada línea en paralelo"
#!/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
{1..3}
ligeramente el código para usar la expansión de {1..3}
lugar de codificar los números desde que me di cuenta de que usted dijo que hay muchos más archivos que solo 3. La expansión de llaves hace que la escalada a números más grandes sea trivial al reemplazar el ''3'' Dentro de las llaves a cualquier número que necesites.