GNU parallel — это утилита командной строки для Linux и других Unix-подобных операционных систем, которая позволяет пользователю выполнять скрипты оболочки или команды параллельно . GNU parallel — это свободное программное обеспечение , написанное Оле Танге на языке Perl . Оно доступно на условиях GPLv3 . [2]
Наиболее распространенное применение — замена оболочки петли, например
пока читаем x ; делаем do_something " $x " сделано < список
к форме
список кошек | параллель do_something
где файл list
содержит аргументы для do_something
и где process_output
может быть пустым.
Скрипты, использующие parallel, часто легче читать, чем скрипты, использующие pexec .
Программа также имеет параллельные функции
По умолчанию параллельно выполняется столько заданий, сколько имеется ядер ЦП .
find . -name "*.foo" | параллельная строка grep
Вышеприведенное является параллельным эквивалентом:
найти . -имя "*.foo" -exec grep bar {} +
Это ищет все файлы в текущем каталоге и его подкаталогах, имена которых заканчиваются на .foo
для вхождений строки . bar
Параллельная команда будет работать как и ожидалось, если имя файла не содержит символ новой строки . Чтобы обойти это ограничение, можно использовать:
найти . -name "*.foo" -print0 | parallel -0 grep bar
Приведенная выше команда использует нулевой символ для разделения имен файлов.
найти . -name "*.foo" | parallel -X mv {} /tmp/trash
Приведенная выше команда расширяется {}
с таким количеством аргументов, которое позволяет длина командной строки, распределяя их равномерно между параллельными заданиями, если это необходимо. Это может снизить накладные расходы процесса для краткосрочных команд, которые требуют меньше времени для завершения, чем для запуска.
найти . -maxdepth 1 -type f -name "*.ogg" | parallel -X -r cp -v -p {} /home/media
Команда выше делает то же самое:
cp -v -p *.ogg /home/media
Однако предыдущая команда, использующая find
/ parallel
/, cp
более эффективно использует ресурсы и не остановится с ошибкой, если расширение *.ogg слишком велико для оболочки.