параллельный tar-конвейер xargs - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь скопировать очень большую файловую систему, используя параллельный конвейер заданий создания / извлечения tar, используя xargs. Я не могу понять правильный синтаксис.

find image -maxdepth 2 -mindepth 2 -type d -print|xargs -P 48 tar cf - --files-from|(cd /testfiles; tar xf -)

Я получаю эти ошибки:

xargs: tar: завершается сигналом 13
xargs: tar: завершается сигналом 13

Но если я выполню ту же команду без опции -P, она запустится. Это просто однопотоковый процесс, который займет 50 миллионов файлов в подкаталогах 700K.

Следующее работает, но медленно:

find image -maxdepth 2 -mindepth 2 -type d -print|xargs tar cf - --files-from|(cd /testfiles; tar xf -)

Так что же мне не хватает?

1 Ответ

0 голосов
/ 05 мая 2018

Проблема в том, что ваш параллельный конвейер stdout потребляется "одним" stdin из |(cd /testfiles; tar xf -)

Таким образом, вам нужно "также" распараллелить часть tar xf -, возможное решение - обработать этот конвейер как "мини-скрипт", а затем получить аргументы xargs, переданные с $@:

find image -maxdepth 2 -mindepth 2 -type d -print| \
  xargs -P 48 sh -c 'tar cf - --files-from $@ | tar -C /testfiles -xf -' -- 

Кстати, я бы тоже был осторожен с -P 48, начните с большего экономного значения, пока не найдете удобный компромисс для влияния ввода / вывода выше.

...