See GNU parallel to launch subprocesses in parallel. Has similar syntax as xargs. From the docs:
To compress all html files using gzip run:
find . -name '*.html' | parallel gzip --best
Большая часть обработки командных файлов Bash-скриптами может быть ускорена путем запуска нескольких процессов для использования всех ядер. Я хочу сделать скрипт, который будет обрабатывать кучу файлов, разделяя количество файлов для одинаковой обработки между процессами. Как мне это сделать?
See GNU parallel to launch subprocesses in parallel. Has similar syntax as xargs. From the docs:
To compress all html files using gzip run:
find . -name '*.html' | parallel gzip --best
Я не знаю, является ли это наилучшим способом сделать это, но вот что я придумал.
Использование: batch.sh [number of processes to use]
batch.sh:
end=$(( $1 - 1 )) for i in `seq 0 $end`; do echo Spawning helper $i of $end ./helper.sh $i $1 & done
helper.sh:
n=$1 for file in ./*; do # Your code here v echo Processing file: $file # ^ n=$((n+1)) n=$((n%$2)) done
Это порождает n процессов, каждый из которых обрабатывает файл, затем пропускает (n - 1) файлов. Process (i mod n) обрабатывает i-й файл.