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 l'elaborazione di ogni riga fino al termine del comando, quindi il passaggio a quella successiva richiede molto tempo, voglio elaborare ad esempio 20 righe contemporaneamente, quindi quando hanno terminato vengono elaborate altre 20 righe.
Ho pensato di wget LINK1 >/dev/null 2>&1 &
inviare il comando in background e continuare, ma ci sono 4000 righe qui, questo significa che avrò problemi di prestazioni, per non parlare del fatto che sono limitati in quanti processi dovrei iniziare contemporaneamente, quindi non è un buon idea.
Una soluzione a cui sto pensando in questo momento è 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
Naturalmente in questo caso dovrò aggiungere e alla fine della linea! Ma sento che questo non è il modo giusto per farlo.
Quindi, come posso effettivamente raggruppare ogni 20 righe insieme e aspettare che finiscano prima di passare alle 20 righe successive, questo script è generato dinamicamente in modo che io possa fare tutto ciò che voglio su di essa mentre viene generato, ma NON DEVE usa wget, era solo un esempio, quindi qualsiasi soluzione specifica per wget non mi farà del bene.
wait
è la risposta giusta qui, ma la tuawhile [ $(ps …
sarebbe molto meglio scrittawhile pkill -0 $KEYWORD…
- usando proctools ... cioè, per motivi legittimi per verificare se un processo con un nome specifico è ancora in esecuzione.