Script Bash che elabora il numero limitato di comandi in parallelo

Ho uno script bash che assomiglia a questo:

#!/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 

Ma elaborare ogni riga fino al termine del comando, quindi passare a quella successiva è molto dispendioso in termini di tempo, voglio elaborare per esempio 20 righe contemporaneamente e al termine dell’elaborazione di altre 20 righe.

Ho pensato a wget LINK1 >/dev/null 2>&1 & per inviare il comando allo sfondo e andare avanti, ma ci sono 4000 righe qui questo significa che avrò problemi di prestazioni, per non parlare di essere limitato in quanti processi dovrei iniziare allo stesso tempo, quindi questa non è una buona idea.

Una soluzione a cui sto pensando in questo momento consiste nel verificare se uno dei comandi è ancora in esecuzione o meno, ad esempio dopo 20 righe posso aggiungere questo ciclo:

 while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do sleep 1 done 

Ovviamente in questo caso dovrò aggiungere e alla fine della riga! Ma sento che questo non è il modo giusto per farlo.

Quindi, come faccio a raggruppare ogni 20 righe e aspettare che finiscano prima delle 20 righe successive, questo script viene generato dynamicmente in modo da poter fare qualsiasi cosa di matematica io voglia mentre viene generato, ma NON DEVE usa wget, era solo un esempio quindi qualsiasi soluzione wget specifica non mi farà nulla di buono.

Usa l’ wait integrata:

 process1 & process2 & process3 & process4 & wait process5 & process6 & process7 & process8 & wait 

Per l’esempio precedente, 4 processi process4process4 verrebbe avviato in background e la shell aspetterebbe che questi vengano completati prima di iniziare il set successivo.

Dal manuale GNU :

 wait [jobspec or pid ...] 

Attendere fino a quando il processo figlio specificato da ciascun ID di processo ID o le exit di jobspec della specifica del lavoro e restituire lo stato di uscita dell’ultimo comando atteso. Se viene fornita una specifica del lavoro, vengono attesi tutti i processi nel lavoro. Se non vengono forniti argomenti, vengono attesi tutti i processi figli attualmente attivi e lo stato di ritorno è zero. Se né jobspec né pid specificano un processo figlio attivo della shell, lo stato di ritorno è 127.

Vedi parallelo . La sua syntax è simile a xargs , ma esegue i comandi in parallelo.

Infatti, xargs può eseguire comandi in parallelo per te. C’è un’opzione di riga di comando speciale -P max_procs per quello. Vedi man xargs .

È ansible eseguire 20 processi e utilizzare il comando:

 wait 

Lo script attenderà e continuerà quando tutti i tuoi lavori in background sono finiti.