Gzip со всеми ядрами
У меня есть набор серверов, каждый из которых заполнен кучей файлов, которые можно распаковать. Все серверы имеют разное количество ядер. Как я могу написать bash-скрипт для запуска gzip для каждого ядра и убедиться, что gzips не упаковывают один и тот же файл?
3 ответа
Решение
Если вы работаете в Linux, вы можете использовать GNU xargs для запуска столько процессов, сколько у вас есть ядер.
CORES=$(grep -c '^processor' /proc/cpuinfo)
find /source -type f -print0 | xargs -0 -n 1 -P $CORES gzip -9
- find -print0 / xargs -0 защищает вас от пробелов в именах файлов
- xargs -n 1 означает один процесс gzip на файл
- xargs -P указывает количество заданий
- gzip -9 означает максимальное сжатие
Существует реализация многопоточного gzip, pigz. Поскольку он сжимает один файл в нескольких потоках, он должен иметь возможность читать с диска более эффективно, чем сжатие нескольких файлов одновременно.
Вы можете рассмотреть возможность проверки GNU параллельно. Я также нашел это видео на YouTube, которое, кажется, делает то, что вы ищете.