Как использовать параллель на нескольких компьютерах, чтобы список задач выполнялся только один раз?

Я пытаюсь использовать 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.

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