LINUX.ORG.RU

Как в консоли параллельно выполнять обработку нескольких файлов?

 


1

2

Есть консольная утилита pngcrush и надо ею пережать несколько тысяч картинок.
С помощью find написал обработку их всех. Но такое решение обрабатывает одну картинку за раз используя одно ядро.
Как сделать запуск нескольких процессов pngcrush?

Сходу на ум приходит make --jobs

ados ★★★★★
()

GNU Parallel. Но он на перле, можно накостылять на баше (правда у меня не получилось нормально, но наверно можно).

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

Если религия не позволяет ставить parallel, то параллельный режим есть у xargs. Но первый проще использовать. И он может раскидывать работу по разным машинам.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)

xargs, parallel, ну или напиши скрипт с циклом, итерация которого происходит после уменьшения кол-ва нужных процессов.

IPR ★★★★★
()

Один & в конце строки отправляет процесс в фон и печатает pid этого процесса

Значит делаешь восемь или сколько тебе надо переменных в которых этот pid хранишь и в цикле проверяшь с помощью ps существование процессов с именем pngcrush и хранимым в этой переменой pid.
Как не нащёл процесса то запускаешь процедуру которая запустит новый процесс pngcrush и запомнит его в этой переменной.

Делается всё это на bash

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 2)
Ответ на: комментарий от torvn77

Значит делаешь восемь или сколько тебе надо переменных в которых этот pid хранишь и в цикле проверяшь с помощью ps существование процессов

Не надо переменных и вызывать ps. Достаточно смотреть встроенной командой job. Иначе у вас на ps и уйдёт целое ядро :)

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

зато потенцевал будет раскрываться

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

jobs наверное?

Как я понял она сугубо интерактивная и в скрипт её встроить нельзя, потому что не позволяет форматировать свой вывод, а вот ps можно настроить так, что при запуске она будет выводить только одно нужное значение ps -p$current_pid -o comm

torvn77 ★★★★★
()

Расскажи, каким образом таки распараллелил задачу?

bl ★★★
()
Ответ на: комментарий от i-rinat

Обычно заводят счётчик и пуляют задачи пока они есть и пока количество порождённых процессов меньше желаемого. А эти регистранты какие-то странные.

anonymous
()
Ответ на: комментарий от i-rinat

Да хз. Я чет написал, а уже потом вспомнил про job, но память подвела, и я не помнил, оно это или нет. Поэтому вариант торвн77 мне показался вполне логичным.

Zhbert ★★★★★
()
Ответ на: комментарий от i-rinat

Скорее всего тем, что когда я последний раз писал что-то такое на баш, я именно костылил =) Но было это давно. Так что я не прав, это не оправдание.

Zhbert ★★★★★
()

Параллельная обработка может обломаться об последовательное чтение с диска, особенно на hdd.

anonymous
()

(pngcrush file1) & (pngcrush file2) & (pngcrush file3) & ... или я чего-то не понял?

float
()
Ответ на: комментарий от i-rinat

Тем, что он про них не знал. Я вообще удивляюсь, как он генту осилил.

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