У меня есть куча изображений PNG в каталоге. У меня есть приложение pngout, которое я запускаю для сжатия этих изображений. Это приложение вызывается скриптом, который я сделал. Проблема в том, что этот скрипт делает по одному, что-то вроде этого:
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
Обработка только одного файла за раз, занимает много времени. После запуска этого приложения я вижу, что загрузка процессора составляет всего 10%. Итак, я обнаружил, что могу разделить эти файлы на 4 пакета, поместить каждый пакет в каталог и запустить 4 из четырех окон терминала, четырех процессов, поэтому у меня есть четыре экземпляра моего сценария, одновременно обрабатывающие эти изображения и работа занимает 1/4 времени.
Вторая проблема заключается в том, что я потерял время, разделяя изображения и пакеты и копируя скрипт в четыре директории, открывая 4 окна терминала, бла-бла ...
Как это сделать с одним сценарием, без необходимости что-либо делить?
Я имею в виду две вещи: во-первых, как мне из сценария bash запустить процесс в фоновом режиме? (просто добавьте & в конец?) Второе: как я могу прекратить отправку задач в фоновом режиме после отправки четвертых задач и поставить сценарий для ожидания завершения задач? Я имею в виду, просто отправка новой задачи в фоновом режиме, когда одна задача заканчивается, и всегда остается 4 параллельных задачи? если я не сделаю этого, цикл запустит миллионы задач в фоновый режим, и процессор засорится.