ejecutar varios comandos a la vez

ejecutar varios comandos a la vez

Necesito ejecutar muchos comandos similares en el menor tiempo posible y utilizando todos los recursos disponibles.

Por ejemplo, mi caso es el procesamiento de imágenes, cuando uso el siguiente comando: for INPUT in *.jpg do; some_command; doneel comando se ejecuta uno por uno y no utiliza todos los recursos disponibles.

Pero, por otro lado, la ejecución for INPUT in *.jpg do; some_command &; donehace que la máquina se quede sin recursos en muy poco tiempo.

Conozco atel batchcomando, pero no estoy seguro de poder usarlo en mi caso. Corrígeme si estoy equivocado.

Entonces estaba pensando en poner los comandos en algún tipo de cola y ejecutar solo una parte de ellos a la vez. No sé cómo hacerlo de forma rápida y ese es el problema. Estoy seguro de que alguien tuvo un problema similar antes.

Por favor avise.

Respuesta1

GNU Parallel está hecho exactamente para esto:

parallel some_command {} ::: *.jpg

El valor predeterminado es un trabajo por núcleo de CPU. En su caso, es posible que desee ejecutar un trabajo más de los que tiene núcleos:

parallel -j+1 some_command {} ::: *.jpg

GNU Parallel es un paralelizador general y facilita la ejecución de trabajos en paralelo en la misma máquina o en varias máquinas a las que tiene acceso ssh.

Si tiene 32 trabajos diferentes que desea ejecutar en 4 CPU, una forma sencilla de paralelizar es ejecutar 8 trabajos en cada CPU:

Programación sencilla

En cambio, GNU Parallel genera un nuevo proceso cuando uno finaliza, manteniendo las CPU activas y, por lo tanto, ahorrando tiempo:

Programación paralela GNU

Instalación

Por razones de seguridad, debe instalar GNU Parallel con su administrador de paquetes, pero si GNU Parallel no está empaquetado para su distribución, puede realizar una instalación personal, que no requiere acceso de root. Se puede hacer en 10 segundos haciendo esto:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para otras opciones de instalación consultehttp://git.savannah.gnu.org/cgit/parallel.git/tree/README

Aprende más

Ver más ejemplos:http://www.gnu.org/software/parallel/man.html

Mira los vídeos de introducción:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Sigue el tutorial:http://www.gnu.org/software/parallel/parallel_tutorial.html

Regístrese en la lista de correo electrónico para obtener ayuda:https://lists.gnu.org/mailman/listinfo/parallel

Respuesta2

Puede usar GNU make con la --jobsopción de ejecutar cosas en paralelo pero limitado a la cantidad especificada de trabajos. Puede adaptar ese número a algo que no apague su máquina.

Aquí hay un Makefile de ejemplo que usa objetivos (estos podrían ser sus archivos de salida, por ejemplo) y ejecuta un conjunto (ficticio) de comandos para cada objetivo:

all: a b c d e f g h

a b c d e f g h:
    echo $@; sleep 10

NB La sangría del comando.debeser un carácter TAB. Ver elGNU hace documentaciónpara obtener más detalles sobre la sintaxis de Makefiles.

Puede invocar make with make --jobs 4y obtener el siguiente resultado (lo usé time make --jobs 4a continuación para mostrar el tiempo transcurrido):

echo a; sleep 10
echo b; sleep 10
echo c; sleep 10
echo d; sleep 10
b
a
c
d
echo e; sleep 10
echo f; sleep 10
echo g; sleep 10
e
f
echo h; sleep 10
g
h

real    0m20.009s
user    0m0.010s
sys 0m0.011s

Los primeros cuatro se ejecutaron en paralelo, luego los cuatro siguientes, por lo que el tiempo total transcurrido es de 20 segundos.

información relacionada