Как использовать параллель на нескольких компьютерах, чтобы список задач выполнялся только один раз?
Я пытаюсь использовать parallel
на нескольких серверах с использованием ssh
, что на самом деле я хотел бы сделать, это что-то вроде:
parallel -s computer_list.txt < command.txt
в которой server_list.txt
есть список серверов и в command.txt
похоже
fist_job.sh
second_job.sh
...
Но я не хочу, чтобы все серверы выполняли все работы в списке, я хочу, чтобы каждый *.sh
выполняется только один раз на случайном сервере, все они могут получить доступ ко всем файлам, которые им необходимы для выполнения каждой команды.
Другими словами, то, что я ищу, является своего рода обобщением:
parallel < command.txt
2 ответа
Я думаю, вы могли бы сделать что-то вроде этого:
servers.txt
server1
server2
server3
server4
serverA
serverB
raspi10
raspi11
raspi12
raspi13
supercomputerA
supercomputerB
jobs.txt
job1
job2
job3
job4
job5
job6
Тогда используйте это bash
сценарий:
#!/bin/bash
# Read in list of jobs into array
jobs=( $(<jobs.txt) )
# Get randomised list of servers
servers=( $( gshuf servers.txt) )
# Assign each job to a server and execute in parallel
for ((i==0;i<${#jobs[@]};i++)) ; do
echo "ssh \"${servers[i]}\" \"${jobs[i]}\""
done | parallel
пример
Это генерирует следующий вход для GNU Parallel:
ssh "raspi12" "job1"
ssh "serverA" "job2"
ssh "serverB" "job3"
ssh "raspi13" "job4"
ssh "server3" "job5"
ssh "supercomputerB" "job6"
Примечания:
gshuf
я показываю GNU shuf
(shuffle) устанавливается на Mac. Это может быть известно как shuf
на других машинах.
Это работает для меня:
parallel --slf computer_list.txt < command.txt
Я использую версию 20180822.