Параллельное выполнение команд с одного читаемого файла

Задача: допустим, при создании тяжелого бэкапа или вообще дампа диска, необходимо параллельно к созданию сжатого файла еще и создать контрольную сумму исходного файла.

Сделать это можно с помощью утилиты pee, входящей в состав пакета программ moreutils. Для установки в Ubuntu используем apt install moreutils.

Сделать это можно так:

dd if=test | pee "dd of=newtest" "sha512sum".

Результаты следующие:

Последовательное выполнение

Тут пришлось делать скрипт, т.к. time не хотел никак выполнять несколько команд. 
cat ./sc
#!/bin/bash
if=test of=newtest
sha512sum test

time ./sc 678d36fc5a1d14b23dcd04740604a643f2d3159167af1211ab779ac10394ac443a06feabee9d826fd715bce84e0d13ea75bc85fe990e340e775c1d9521c8dac9 test

real 0m24.453s
user 0m23.885s
sys 0m0.548s

[свернуть]

Параллельное выполнение

time dd if=test | pee "dd of=newtest" "sha512sum"
1228276+0 records in
1228276+0 records out
628877312 bytes (629 MB, 600 MiB) copied, 14.766 s, 42.6 MB/s
1228276+0 records in
1228276+0 records out
628877312 bytes (629 MB, 600 MiB) copied, 14.4783 s, 43.4 MB/s
678d36fc5a1d14b23dcd04740604a643f2d3159167af1211ab779ac10394ac443a06feabee9d826fd715bce84e0d13ea75bc85fe990e340e775c1d9521c8dac9 -

real 0m14.779s
user 0m12.009s
sys 0m22.671s

[свернуть]

Также можно сделать и с архивом:

tar cf - test | cat | pee "dd of=archive.tar" "sha512sum"

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

где:

test - имя архивируемого файла/директории

archive.tar - имя конечного архива

Для создания сжатого архива, например, lz4:

tar cf - test | lz4 -z| cat | pee "dd of=archive.tar.lz4" "sha512sum"

Как мы видим, параллельное выполнение значительно быстрее, особенно при нескольких задачах, нежели последовательное, и при работе с большими файлами это просто необходимость.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *