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