1

Большая часть обработки командных файлов Bash-скриптами может быть ускорена путем запуска нескольких процессов для использования всех ядер. Я хочу сделать скрипт, который будет обрабатывать кучу файлов, разделяя количество файлов для одинаковой обработки между процессами. Как мне это сделать?

2 ответа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-й файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .