Используйте GNU Parallel (отрегулируйте -j, как считаете нужным. Удалите его, если вы хотите количество процессоров):
for each in `ls ${INPUT_DIR}/MDX*.txt`
do
java -Xms256m -Xmx1024m -cp ${CLASSPATH} com.wf.xn.etcc.Main -config=${CONFIG_FILE}
...
for SCALE_PDF in `ls ${PROCESS_DIR}/*.pdf`
do
OUTPUT_AFP=${OUTPUT_DIR}/`basename ${SCALE_PDF}`
OUTPUT_AFP=`print ${OUTPUT_AFP} | sed s/pdf/afp/g`
sem --id myid -j 5 ${PROJ_DIR}/myscript.sh -i ${SCALE_PDF} -o ${OUTPUT_AFP}
done
done
sem --wait --id myid
sem
является частью GNU Parallel.
Это будет поддерживать 5 заданий, пока не останется только 5 заданий. Затем он позволит вашему java работать во время завершения последних 5. sem --wait
также будет ждать, пока последние 5 не будут завершены.
В качестве альтернативы:
for each ...
java ...
...
ls ${PROCESS_DIR}/*.pdf |
parallel -j 5 ${PROJ_DIR}/myscript.sh -i {} -o ${OUTPUT_DIR}/{/.}.afp
done
Это будет запускать 5 заданий параллельно и запускать Java только после завершения всех заданий.
В качестве альтернативы вы можете использовать трюк очереди, описанный в справочной странице GNU Parallel: https://www.gnu.org/software/parallel/man.html#example__gnu_parallel_as_queue_system_batch_manager
echo >jobqueue; tail -f jobqueue | parallel -j5 &
for each ...
...
ls ${PROCESS_DIR}/*.pdf |
parallel echo ${PROJ_DIR}/myscript.sh -i {} -o ${OUTPUT_DIR}/{/.}.afp >> jobqueue
done
echo killall -TERM parallel >> jobqueue
wait
Это запустит Java, а затем добавит задания для запуска в очередь. После добавления рабочих мест java будет запущен сразу. В течение всего времени 5 заданий будут выполняться из очереди, пока очередь не станет пустой.
Вы можете установить GNU Parallel просто:
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
Посмотрите вступительные видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 и пройдите учебник (man parallel_tutorial). Ты командная строка с любовью тебя за это.