Большая часть обработки командных файлов 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-й файл.