Ich habe ein paar PNG-Bilder in einem Verzeichnis. Ich habe eine Anwendung namens pngout, mit der ich diese Bilder komprimiere. Diese Anwendung wird von einem Skript aufgerufen, das ich erstellt habe. Das Problem ist, dass dieses Skript eines nach dem anderen ausführt:
FILES=(./*.png)
for f in "${FILES[@]}"
do
echo "Processing $f file..."
# take action on each file. $f store current file name
./pngout -s0 $f R${f/\.\//}
done
Die Verarbeitung von jeweils nur einer Datei nimmt viel Zeit in Anspruch. Nach dem Ausführen dieser App sehe ich, dass die CPU nur 10% beträgt. So entdeckte ich, dass ich diese Dateien in 4 Stapel aufteilen, jeden Stapel in ein Verzeichnis stellen und 4 aus vier Terminalfenstern vier Prozesse auslösen kann, so dass ich vier Instanzen meines Skripts gleichzeitig habe, die diese Bilder und das Skript verarbeiten Job dauert 1/4 der Zeit.
Das zweite Problem ist, dass ich Zeit verloren habe, die Bilder und Stapel aufzuteilen und das Skript in vier Verzeichnisse zu kopieren, 4 Terminalfenster zu öffnen, bla bla ...
Wie geht das mit einem Skript, ohne etwas teilen zu müssen?
Ich meine zwei Dinge: Erstens, wie kann ich aus einem Bash-Skript einen Prozess in den Hintergrund abfeuern? (Fügen Sie einfach & zum Ende hinzu?) Zweitens: Wie stoppe ich das Senden von Aufgaben an den Hintergrund, nachdem ich die vierten Aufgaben gesendet habe, und setze das Skript so lange, bis die Aufgaben beendet sind? Ich meine, nur eine neue Aufgabe in den Hintergrund zu schicken, wenn eine Aufgabe endet und immer 4 Aufgaben gleichzeitig erledigt sind? Wenn ich das nicht tue, wird die Schleife zig Millionen von Aufgaben im Hintergrund auslösen und die CPU wird verstopfen.