Большая часть обработки командных файлов Bash-скриптами может быть ускорена путем запуска нескольких процессов для использования всех ядер. Я хочу сделать скрипт, который будет обрабатывать кучу файлов, разделяя количество файлов для одинаковой обработки между процессами. Как мне это сделать?
2 ответа
4
Смотрите GNU параллельно, чтобы параллельно запускать подпроцессы. Синтаксис похож на xargs. Из документов:
Чтобы сжать все HTML-файлы с помощью gzip, выполните:
find . -name '*.html' | parallel gzip --best
1
Я не знаю, является ли это наилучшим способом сделать это, но вот что я придумал.
Использование: 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-й файл.
