chown с обоих концов очень длинного списка файлов

Ваш VirtualBox работает на хосте Linux или Windows? если в Windows вы можете загрузить такой инструмент, как putty, и подключиться к протоколу ssh к вашей виртуальной машине. Если это на Linux, поэтому откройте терминал, вам также нужно подключиться к ssh, если он не работает. Попробуйте установить ssh-сервер и клиент с помощью sudo apt-get install openssh-client

1
задан 23 December 2017 в 01:08

4 ответа

Знакомьтесь parallel (sudo apt install parallel):

GNU parallel - это инструмент командной строки для параллельного выполнения заданий с использованием одного или нескольких компьютеров. Задание может быть одной командой или маленьким скриптом, который должен быть запущен для каждой из строк на входе. Типичным входом является список файлов, список хостов, список пользователей, список URL-адресов или список таблиц. Задание также может быть командой, которая считывает из трубы. GNU-параллель может затем разбивать входные данные на блоки и параллельно подключать блок к каждой команде. (...) Для каждой строки ввода GNU parallel будет выполняться command с линией в качестве аргументов. Если команда не указана, выполняется строка ввода. Несколько строк будут выполняться параллельно. Параметр GNU часто может использоваться в качестве замены для xargs или cat | bash.

Пример

find . -type f -print0 | parallel -0 chmod +w

Это будет рекурсивно находить каждый файл в текущем каталоге и запускать на нем chmod +w, одновременно выполняя несколько процессов - по одному процессу на ядро ​​процессора по умолчанию.

Подробнее см. man parallel, особенно удивительный список объясненных примеров. Также есть плейлист с примерами видео на youtube.

2
ответ дан 18 July 2018 в 00:37

Я буду удивлен, если ограничивающий фактор не будет сервером. Поэтому я бы предположил, что решение десерта разумно - возможно, с добавлением -j200 и -X для запуска большего количества параллельных заданий на локальном хосте и вставки более 1 аргумента в каждую строку.

Но предположим, у вас есть ленивые клиенты, тогда это может быть способ сделать это:

doit() { chmod +w "$1" # do other stuff } export -f doit cat 2millionfilelist.txt | parallel --env doit -S nfsclient1,nfsclient2,nfsclient3 doit

Это определяет функцию (адаптируется к вашей собственной потребности). Затем эта функция копируется в каждый из трех nfsclients и запускается с одним аргументом из 2millionfilelist.txt. Это делается параллельно, и по умолчанию выполняется 1 задание на cpucore для каждого из трех клиентов.

Теперь GNU Parallel будет подключаться к nfsclients, используя ssh для каждого из файлов. Таким образом, вышеупомянутое, вероятно, крайне неэффективно. Но мы можем сделать лучше.

doitwrap() { doit() { chmod +w "$1" # do other stuff } export -f doit parallel doit } export -f doitwrap cat 2millionfilelist.txt | parallel --env doitwrap -S nfsclient1,nfsclient2,nfsclient3 --pipe -N1000 doitwrap

doit делает то же самое, что и раньше, но теперь у нас есть обертка, которая читается со стандартного ввода и запускает doit на локальной машине. Итак, теперь нам просто нужно равномерно распределить 2millionfilelist.txt с тремя клиентами.

GNU Parallel также может это сделать. Мы передаем doitwrap каждому из трех рабочих, а затем запускаем его там. Затем мы передаем 2millionfilelist.txt в блоках из 1000 строк 3 работникам.

0
ответ дан 18 July 2018 в 00:37

Знакомьтесь parallel (sudo apt install parallel):

GNU parallel - это инструмент командной строки для параллельного выполнения заданий с использованием одного или нескольких компьютеров. Задание может быть одной командой или маленьким скриптом, который должен быть запущен для каждой из строк на входе. Типичным входом является список файлов, список хостов, список пользователей, список URL-адресов или список таблиц. Задание также может быть командой, которая считывает из трубы. GNU-параллель может затем разбивать входные данные на блоки и параллельно подключать блок к каждой команде. (...) Для каждой строки ввода GNU parallel будет выполняться command с линией в качестве аргументов. Если команда не указана, выполняется строка ввода. Несколько строк будут выполняться параллельно. Параметр GNU часто может использоваться в качестве замены для xargs или cat | bash.

Пример

find . -type f -print0 | parallel -0 chmod +w

Это будет рекурсивно находить каждый файл в текущем каталоге и запускать на нем chmod +w, одновременно выполняя несколько процессов - по одному процессу на ядро ​​процессора по умолчанию.

Подробнее см. man parallel, особенно удивительный список объясненных примеров. Также есть плейлист с примерами видео на youtube.

2
ответ дан 24 July 2018 в 17:15
  • 1
    Woah ^ _ ^ !!!!!!! – Neurax 23 December 2017 в 01:43
  • 2
    Можете ли вы уточнить использование нескольких узлов? Вы используете главный узел для отправки заданий другим узлам? Разве это не разрушает сериализованный характер? – Neurax 23 December 2017 в 02:58
  • 3
    @Neurax Я не совсем уверен, что вы называете node , но посмотрите на параметр -j / -P. Если вы хотите отстать от parallel, источники, о которых я говорил, помогут - плюс есть учебник по man parallel_tutorial. – dessert 23 December 2017 в 03:41

Я буду удивлен, если ограничивающий фактор не будет сервером. Поэтому я бы предположил, что решение десерта разумно - возможно, с добавлением -j200 и -X для запуска большего количества параллельных заданий на локальном хосте и вставки более 1 аргумента в каждую строку.

Но предположим, у вас есть ленивые клиенты, тогда это может быть способ сделать это:

doit() { chmod +w "$1" # do other stuff } export -f doit cat 2millionfilelist.txt | parallel --env doit -S nfsclient1,nfsclient2,nfsclient3 doit

Это определяет функцию (адаптируется к вашей собственной потребности). Затем эта функция копируется в каждый из трех nfsclients и запускается с одним аргументом из 2millionfilelist.txt. Это делается параллельно, и по умолчанию выполняется 1 задание на cpucore для каждого из трех клиентов.

Теперь GNU Parallel будет подключаться к nfsclients, используя ssh для каждого из файлов. Таким образом, вышеупомянутое, вероятно, крайне неэффективно. Но мы можем сделать лучше.

doitwrap() { doit() { chmod +w "$1" # do other stuff } export -f doit parallel doit } export -f doitwrap cat 2millionfilelist.txt | parallel --env doitwrap -S nfsclient1,nfsclient2,nfsclient3 --pipe -N1000 doitwrap

doit делает то же самое, что и раньше, но теперь у нас есть обертка, которая читается со стандартного ввода и запускает doit на локальной машине. Итак, теперь нам просто нужно равномерно распределить 2millionfilelist.txt с тремя клиентами.

GNU Parallel также может это сделать. Мы передаем doitwrap каждому из трех рабочих, а затем запускаем его там. Затем мы передаем 2millionfilelist.txt в блоках из 1000 строк 3 работникам.

0
ответ дан 24 July 2018 в 17:15
  • 1
    Очень круто! Я не знал, что это возможно. Мне очень нравятся функции двойной оболочки. Перейдем к тестированию сейчас и немного отчитаемся. – Neurax 26 December 2017 в 21:51

Другие вопросы по тегам:

Похожие вопросы: