Скрипт Bash для обработки файлов с использованием нескольких процессов

777
sudo

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

1

2 ответа на вопрос

4
Felipe Lema

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

Похоже, что GNU Parallel не предустановлен во многих системах Unix (включая OS X и Ubuntu Server), но он намного лучше, чем другой метод, если у вас есть возможность установить его. Спасибо за чаевые. sudo 9 лет назад 0
1
sudo

Я не знаю, является ли это наилучшим способом сделать это, но вот что я придумал.

Использование: 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-й файл.