LINUX.ORG.RU

Многопоточная работа bash скрипта


0

2

Здравствуйте.

Есть куча (много тысяч) графических файлов, их я конвертирую в pdf используя bash скрипт. Примерно такой

convert 1.png 1.pdf
convert 2.png 2.pdf
convert 3.png 3.pdf
convert 4.png 4.pdf
и т.д.
Обработка занимает несколько часов, т.к. файлы 1.png и т.д. довольно таки большие.
Но имея процессор с несколькими ядрами получается, что в единицу времени загружено одно ядро, а остальные простаивают. Делал, так - разбивал скрипт на 2 части и в разных консолях запускал. Чувствую что есть способ лучше распаралелить это и заставить все ядра трудиться. Подскажите как лучше сделать это?

Порутчик внезапность сообщает

 $ parallel  -help
parallel [OPTIONS] command -- arguments
	for each argument, run command with argument, in parallel
parallel [OPTIONS] -- commands
	run specified commands in parallel
Rzhepish ()
Ответ на: комментарий от backbone

for i in `seq 100500`; do nohup convert $i.png $i.pdf; done && watch 'tail ~/nohup.out | sort -h' ; rm ~/nohup.out

Спасибо, попробую

files32 ()
Ответ на: комментарий от files32

sys-apps/moreutils-0.45 (/usr/bin/parallel)

Предложенный вариант выше запустит 100500 процессов, это либо приведёт к свопу и запуску OOM killer'a, либо к запуску OOM killer'a, либо процессы не запустятся из-за ulimit'ов. В любом случае часть файлов не будет преобразованно.

Вот тебе ещё один вариант. Пишешь Makefile и запускаешь его с -j [num_of_parallel_jobs]

Содержание приблизительно такое:

SRCS=$(wildcard *.png)

all: $(SRCS:.png=.pdf)

%.pdf: %.png
          convert "$<" "$@"

Rzhepish ()
Ответ на: комментарий от backbone

И в чем прикол? может ты все процессы в фоне хотел запустить? тогда не хватает &

Если все сразу запустить то может и поплохеть, а если как у тебя, то это последовательно, на одном ядре.

sdio ★★★★★ ()
Ответ на: комментарий от Rzhepish

А, да, for ...; do convert ... & done, но похоже это пример, как не надо делать...

backbone ★★★★★ ()
Ответ на: комментарий от Rzhepish

Вот тебе ещё один вариант. Пишешь Makefile и запускаешь его с -j [num_of_parallel_jobs]

По идее это можно делать с любым makefile ?

files32 ()

По-моему автору было бы более чем достаточно чего-нибудь типа find -name '*.png' -print0 | xargs -0 -P8 -l convert {} {}.pdf

AnDoR ★★★★★ ()

А тебе потом, случаем, не надо будет склеить эти pdf'ы в один многостраничный pdf?

sdio ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.