Mam kilka obrazów PNG w katalogu. Mam aplikację o nazwie pngout, którą uruchamiam w celu skompresowania tych obrazów. Ta aplikacja jest wywoływana przez skrypt, który zrobiłem. Problem polega na tym, że ten skrypt wykonuje jeden po drugim, mniej więcej tak:
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
Przetwarzanie tylko jednego pliku na raz zajmuje dużo czasu. Po uruchomieniu tej aplikacji widzę, że procesor ma zaledwie 10%. Odkryłem więc, że mogę podzielić te pliki na 4 partie, umieścić każdą partię w katalogu i uruchomić 4, z czterech okien terminala, czterech procesów, więc mam cztery instancje skryptu, jednocześnie przetwarzając te obrazy i praca zajmuje 1/4 czasu.
Drugi problem polega na tym, że straciłem czas na dzielenie obrazów i partii oraz kopiowanie skryptu do czterech katalogów, otwieranie 4 okien terminali, bla bla ...
Jak to zrobić za pomocą jednego skryptu, bez konieczności dzielenia czegokolwiek?
Mam na myśli dwie rzeczy: po pierwsze, jak przejść ze skryptu bash, odpalić proces w tle? (wystarczy dodać & na końcu?) Po drugie: jak przestać wysyłać zadania w tle po wysłaniu czwartych zadań i ustawić skrypt, aby czekał na zakończenie zadań? Mam na myśli, po prostu wysyłając nowe zadanie w tle, gdy kończy się jedno zadanie, utrzymując zawsze 4 zadania równolegle? jeśli tego nie zrobię, pętla uruchomi w tle zilliony zadań i procesor się zatka.