LINUX.ORG.RU

Передача файла в связке parallel + ssh

 ,


0

2

Всем привет!

Есть н-ое кол-во хостов (порядка 1500), куда я забрасываю скрипты, они там отрабатывают и я получаю результат.
Сейчас я использую связку scp + parallel для того, чтобы забросить скрипт, и связку ssh + parallel что-бы его запустить.
Использование gnu parallel весьма сильно экономит время.
Я хочу объединить все в один запрос, но никак не могу понять, почему это не работает:

parallel --tagstring {} -q -a file_ip_addr_hosts.csv\  
sshpass -p pass ssh user@{}\  
'cat > file_for_send.sh && source file_for_send.sh && echo result' < file_for_send.sh

Без использования parallel эта конструкция вполне себе работает.
Судя по логам, parallel просто игнорирует < file_for_send.sh, ssh соответственно тоже ничего не видит.

Буду благодарен за любые наводки.



Последнее исправление: Demien (всего исправлений: 1)

Использовал такое:

parallel --halt 0 --bar --progress --sshloginfile parallel_server_list_file.txt \
--transferfile trf409.linux64 \ # закидываем прогу кот. будет работать
--transferfile {1} \ # закидываем файл с данными
--return {1}.2.5.7.80.10.50.2000.dat \ # какой файл скачать обратно когда прога отработает
./trf409.linux64 {1}  2 5 7 80 10 50 2000 -d -h \ # команда запуска проги
:::: parallel_trf.jobs # файл состояния выполняемых задач

Файлы закидываются в домашнюю директорию пользователя заданного в parallel_server_list_file.txt

parallel_server_list_file.txt

10/:
7/ncbi_blast@192.168.1.104
50/ivm@192.168.56.171

Первая цифра: кол-во паралельных задач на этом сервере

imatveev13
()
Ответ на: комментарий от imatveev13

Спасибо, придется использовать –sshlogin, не хотел просто его до этого городить). Мне просто стало интересно, почему не работает эта конструкция. Paralle в данном виде по сути оболочка, запускающая цепочку ssh в виде отдельных процессов.

Demien
() автор топика

Нафига sshpass? Ключи нельзя использовать?

Разница существенная: «< file_for_send.sh» выполняется shell-ом для sshpass и ssh без parallel, а с parallel оно передает его в stdin parallel.

Использовать stdin для parallel - плохая идея.

не проще ли сделать cat file_for_send.sh | ssh user@{} 'bash -' а «echo result» запихнуть в cat file_for_send.sh

Я бы запихнул в файл

 cat "$1" | ssh "user@$2" 'bash -' 
и для parallel указывал бы этот файл с двумя аргументами...

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)

По хорошей традиции, выкладываю собственное же решение. Как обычно, впоследствии, оно часто оказывается не просто, а очень просто:

parallel –tagstring {} -q -a file_ip_addr_hosts.csv\
sshpass -p pass ssh user@{1} $(<file_for_send.sh)

Есть конечно свои издержки, но они ерундовые. Фактически мы передаем файл скрипта для выполнения, но построчно.
Parallel воспринимает этот файл, как один из источников данных.
Поэтому, если к примеру вы выполняете ваш скрипт в отдельной оболочке (при получении рутового доступа su - root sh -c)
все команды объединяем через &&, иначе если у вас создаются в процессе переменные, они потеряются.
В документации про это ничего не нашел, хотя может и плохо искал.
Если эту конструкцию пускать через jumphost, то ‘$(<file_for_send.sh)’ берем в кавычки.
Есть еще один момент, при передаче через jumphost, одинарные кавычки в скрипте (file_for_send.sh) заменяем на

‘\'’

Отдельное спасибо vel, навел на мысль про различные формы передачи файла. Свежий взгляд порой важен.

Demien
() автор топика