linux - programacion - Comandos de procesamiento de script Bash en paralelo
scripts bash ejemplos (4)
De hecho, xargs
puede ejecutar comandos en paralelo para usted. Hay una opción especial de -P max_procs
comando -P max_procs
para eso. Ver man xargs
.
Esta pregunta ya tiene una respuesta aquí:
Tengo un script bash que se ve así:
#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1
Pero procesar cada línea hasta que el comando esté terminado y luego pasar al siguiente consume mucho tiempo, quiero procesar, por ejemplo, 20 líneas a la vez, cuando terminan, se procesan otras 20 líneas.
Pensé en wget LINK1 >/dev/null 2>&1 &
para enviar el comando al fondo y continuar, pero hay 4000 líneas aquí, esto significa que tendré problemas de rendimiento, por no mencionar estar limitado en la cantidad de procesos que debería Comience al mismo tiempo, así que esta no es una buena idea.
Una solución en la que estoy pensando ahora es comprobar si uno de los comandos todavía se está ejecutando o no, por ejemplo, después de 20 líneas, puedo agregar este ciclo:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
¡Por supuesto en este caso necesitaré agregar y al final de la línea! Pero siento que esta no es la forma correcta de hacerlo.
Entonces, ¿cómo puedo agrupar cada 20 líneas y esperar a que terminen antes de ir a las siguientes 20 líneas, este guión se genera dinámicamente para que pueda hacer cualquier matemática que quiera mientras se está generando, pero NO TIENE que use wget, fue solo un ejemplo, por lo que cualquier solución que sea específica de widgets no me servirá de nada.
Puede ejecutar 20 procesos y usar el comando:
wait
Su script esperará y continuará cuando finalicen todos sus trabajos en segundo plano.
Use la wait
incorporada:
process1 &
process2 &
process3 &
process4 &
wait
process5 &
process6 &
process7 &
process8 &
wait
Para el ejemplo anterior, 4 procesos process4
.. process4
se iniciarán en segundo plano, y el shell esperará hasta que se completen antes de comenzar el siguiente conjunto ...
Del manual :
wait [jobspec or pid ...]
Espere hasta que finalice el proceso hijo especificado por cada ID de proceso pid o especificación de trabajo jobspec y devuelva el estado de salida del último comando esperado. Si se proporciona una especificación de trabajo, se esperan todos los procesos en el trabajo. Si no se proporcionan argumentos, se esperan todos los procesos hijo actualmente activos y el estado de retorno es cero. Si ni jobspec ni pid especifica un proceso secundario activo del shell, el estado de retorno es 127.
Ver parallel . Su sintaxis es similar a xargs
, pero ejecuta los comandos en paralelo.