Я пытался распараллелить скрипт, который я использую, но пока что GNU Parallel очень сложен.
У меня есть 2 файла - один содержит хосты для запуска команды, а второй содержит параметры для команды. Ниже приведены примеры данных:
$ cat workers.host
foo@192.168.0.7
bar@192.168.0.8
jerry@192.168.0.9
tom@192.168.0.21
$ cat paths
/usr/local/jar/x/y/ jarxy
/usr/local/jar/z/y/ jarzy
/usr/local/jar/y/y/ jaryy
/usr/local/far/x/y/ farxy
/usr/local/jaz/z/z/ jazzz
/usr/local/mu/txt/ana/ acc01
/usr/local/jbr/x/y/ accxy
И чтобы обработать это, я использую следующий скрипт:
#!/bin/bash
echo "Run this on 192.168.130.10";
DATA=`date +%F`
DDAY=`date +%u`
DOMBAC='nice tar cpzf'
readarray -t hosts < workers.host
len=${#hosts[@]};
processed=0;
while read -r -a line; do
let hostnum=processed%len;
ssh ${hosts[$hostnum]} -i /root/.ssh/id_rsa "$DOMBAC - ${line[0]}" > "/data/backup/$DDAY/${line[1]}_${DATA}_FULL.tgz"
let processed+=1;
done < paths
Это работает хорошо, однако обрабатывает шаг за шагом на машине за машиной. Хосты достаточно мощные, и сеть здесь не проблема, поэтому я хотел максимально распараллелить это. Например, запустите 4 экземпляра команды tar на каждом хосте и передайте вывод через ssh в файл с правильным именем. Я полностью потерян с параллелью --results
--sshloginfile
... И в конечном итоге я пытаюсь выполнить 4 задания на каждом хосте, каждое с разными параметрами (чтобы, например, хост 2 не переписывал то, что хост 1 уже сделал) , Можно ли это сделать в GNU Parallel?
parallel -j${JOBS} --link ./do_on_hosts.sh {1} {2} "$DATA" "$DDAY" :::: workers.host :::: to_backup.path
и в do_on_hosts.sh:ssh $1 "${REMOTE_CMD} ${arr[0]}"> ${LOCAL_STORAGE_PATH}${DDAY}/${arr[1]}_${DATA}_FULL.tgz
интересно, как это можно сравнить с твоей ... нужен еще один раунд, чтобы попробовать.