Supongamos que tengo cinco .sh
scripts Bash ( ) en una carpeta ( my_folder
), y se nombran de la siguiente manera:
script_1.sh
script_2.sh
script_3.sh
script_4.sh
script_5.sh
¿Cómo puedo escribir una sexta secuencia de comandos Bash o solo una línea que comenzará a ejecutar todas estas secuencias de comandos juntas?
Necesito los cinco scripts para comenzar a ejecutarse todos juntos al mismo tiempo y no uno tras otro.
Respuestas:
GNU
parallel
es perfecto para este tipo de cosas. Instalar consudo apt install parallel
y luego:Los
-j
controles cuántos procesos t correr en paralelo, y-j0
significa "todos ellos". Ajústelo a otro valor (p-j20
. Ej. ) Para ejecutar los scripts en lotes.fuente
parallel
comando delmoreutils
paquete. El ejemplo de uso:parallel -j 20 -- my_folder/*.sh
(A diferencia de GNUparallel
,-j0
ejecutaría los scripts de uno en uno).sudo apt install parallel
reemplazará el archivo/usr/bin/parallel
con el de GNU paralelo. Entonces, siempre que lo instale, como sugiere mi respuesta, debería funcionar como se esperaba.parallel
comandos del manual mientras escribía mi respuesta para sugerir GNU en paralelo.Para ejecutar todos los scripts al mismo tiempo (en paralelo) use:
Para ejecutar el uno después del otro (secuencialmente) use:
Mejora para comentarios
Si tiene 200 scripts que desea ejecutar al mismo tiempo (lo que podría atascar la máquina, por cierto) use este script:
Establezca los atributos del script en ejecutable con el comando:
La primera vez que ejecute el script, solo hará eco de los nombres de los 200 scripts que ejecutará. Cuando esté contento de haber seleccionado los nombres correctos, edite el script y cambie esta línea:
a:
Hay tres formas en que puede llamar a un script bash desde otro como se responde aquí:
En el caso de OP, uno o más de los 200 scripts no contenían la
#!/bin/bash
primera línea shebang en el archivo. Como tal, la opción 3. tuvo que ser utilizada.200 secuencias de comandos que se ejecutan al mismo tiempo
Se ha planteado un comentario sobre si están "ejecutándose al mismo tiempo". En un sistema típico de 8 CPU, 25 scripts compartirán una CPU al mismo tiempo, pero solo se ejecutará un script a la vez hasta que se agote el tiempo (medido en milisegundos). Luego, el próximo trabajo recibirá su parte justa de milisegundos, luego el siguiente trabajo, etc., etc.
En términos generales, podemos decir que 200 trabajos se ejecutan "simultáneamente" pero no "simultáneamente" en 8 CPU, lo que equivale a 25 trabajos por CPU:
Imagen de arriba y comentarios a continuación del planificador del kernel de Linux
fuente
bash
prefijo para llamar al script.Hay una herramienta para esto, lee
man run-parts
.Por ejemplo, yo hago:
en mi script de copia de seguridad Palm Pilot.
${visorhome}/pbackup.d/
:fuente
run-parts
ejecuta los scripts secuencialmente en lugar de todos a la vez como lo solicitó el OP. Sin embargo, tiene razón, es probable que ejecutar 200 scripts a la vez no tenga el mismo rendimiento que ejecutar 5, e incluso si ejecutarlos todos a la vez no causa ningún problema, aún puede ser innecesario. He comentado sugerir que el OP aclare sus preferencias a este respecto.run-parts
no ejecutará los scripts (tienen un punto en el nombre:my_folder/*.sh
run-parts
tiene requisitos de nombre de archivo muy específicos por alguna extraña razón. No lanzará nombres de archivo con extensiones, así que me temo que esto no funcionará aquí.Para ejecutar todos los
*.sh
scripts en elmy_folder
directorio al mismo tiempo usandoxargs
:Para limitar el número de scripts ejecutados simultáneamente a
10
:fuente
ls
un script. Usarfind
es mucho más seguro. Es el primer elemento aquí: mywiki.wooledge.org/BashPitfalls#for_f_in_.24.28ls_.2A.mp3.29