Ich habe ein Bash-Skript, das so aussieht:
#!/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
Aber jede Zeile zu verarbeiten, bis der Befehl beendet ist, und dann zur nächsten zu wechseln, ist sehr zeitaufwändig. Ich möchte zum Beispiel 20 Zeilen gleichzeitig verarbeiten. Wenn sie fertig sind, werden weitere 20 Zeilen verarbeitet.
Ich dachte wget LINK1 >/dev/null 2>&1 &
daran, den Befehl in den Hintergrund zu senden und weiterzumachen, aber hier gibt es 4000 Zeilen. Dies bedeutet, dass ich Leistungsprobleme haben werde, ganz zu schweigen davon, dass die Anzahl der Prozesse, die ich gleichzeitig starten sollte, begrenzt ist. Dies ist also nicht gut Idee.
Eine Lösung, an die ich gerade denke, besteht darin, zu überprüfen, ob einer der Befehle noch ausgeführt wird oder nicht. Zum Beispiel kann ich nach 20 Zeilen diese Schleife hinzufügen:
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
Natürlich muss ich in diesem Fall & an das Ende der Zeile anhängen! Aber ich bin der Meinung, dass dies nicht der richtige Weg ist.
Wie gruppiere ich also tatsächlich alle 20 Zeilen und warte, bis sie fertig sind, bevor ich zu den nächsten 20 Zeilen übergehe. Dieses Skript wird dynamisch generiert, damit ich während der Generierung alles tun kann, was ich will, aber es muss NICHT benutze wget, es war nur ein Beispiel, also wird mir jede Lösung, die wget-spezifisch ist, nichts nützen.
wait
ist hier die richtige Antwort, aber Siewhile [ $(ps …
wären viel besser geschriebenwhile pkill -0 $KEYWORD…
- mit proctools ... das heißt, aus legitimen Gründen, um zu überprüfen, ob ein Prozess mit einem bestimmten Namen noch läuft.