как отправлять разные команды на несколько хостов для запуска программ в Linux

Я пользователь R. Я всегда запускаю программы на нескольких компьютерах в кампусе. Например, мне нужно запустить 10 разных программ. Мне нужно открыть PuTTY 10 раз, чтобы войти на 10 разных компьютеров. И подать каждую из программ на каждый из 10 компьютеров (их ОС Linux). Есть ли способ войти в 10 разных компьютеров и отправить им команду одновременно? Я использую следующую команду для отправки программы

nohup Rscript L_1_cc.R > L_1_sh.txt 

nohup Rscript L_2_cc.R > L_2_sh.txt

nohup Rscript L_3_cc.R > L_3_sh.txt

person Alex Brown    schedule 14.04.2015    source источник


Ответы (2)


Сначала настройте ssh, чтобы вы могли войти в систему без ввода пароля (погуглите, если не знаете, как это сделать). Затем напишите сценарий для ssh на каждом удаленном хосте, чтобы выполнить команду. Ниже приведен пример.

#!/bin/bash

host_list="host1 host2 host3 host4 host5 host6 host7 host8 host9 host10"

for h in $host_list
do
    case $h in
        host1)
            ssh $h nohup Rscript L_1_cc.R > L_1_sh.txt
            ;;
        host2)
            ssh $h nohup Rscript L_2_cc.R > L_2_sh.txt
            ;;
        esac
done

Это очень упрощенный пример. Вы можете сделать намного лучше (например, вы можете поместить имена файлов «.R» и «.txt» в переменную и использовать ее, а не явно перечислять все параметры в случае).

person kaylum    schedule 14.04.2015
comment
Спасибо. Есть ли способ использовать ssh в терминале Linux для входа на разные компьютеры и отправки им разных команд, если я уже вошел в Linux с помощью PuTTY? - person Alex Brown; 15.04.2015
comment
Да, просто запустите пример скрипта (после модификации для ваших целей). То есть поместите приведенный выше код в файл (например, my_run.sh), а затем запустите ./my_run.sh из сеанса шпатлевки. - person kaylum; 15.04.2015
comment
Я не очень хорошо знаю линукс. Можете ли вы изменить цикл for? Иногда программа не является последовательной. Могу ли я изменить его следующим образом if(h==mycomputer1.com) ssh $h nohup program_1.R >program_1_out.txt;if(h==mycomputer2.com) ssh $h nohup program_5.R >program_5_out.txt - person Alex Brown; 15.04.2015
comment
Что вы можете. Я обновил ответ, чтобы привести очень упрощенный пример. Для более продвинутого решения я предлагаю вам пройти несколько руководств для начинающих по Linux и сценариям оболочки. Это продвинет вас в долгосрочной перспективе гораздо дальше, чем любой, кто даст вам полное решение этой единственной проблемы. - person kaylum; 15.04.2015
comment
host_list=" c15-0330-02.ad.mtu.edu c15-0330-03.ad.mtu.edu c15-0330-04.ad.mtu.edu c15-0330-05.ad.mtu.edu c15-0330-06.ad.mtu.edu " for h in $host_list do case $h in c15-0330-04.ad.mtu.edu) ssh $h nohup Rscript L_1.R > L_1_sh.txt ;; c15-0330-03.ad.mtu.edu) ssh $h nohup Rscript L_2.R > Ltest_2.shsh.txt ;; esac done Я помещаю это в файл test_2.sh. Но после того, как я его запустил, он показывает : command not found: '/test_2.sh: line 10: syntax error near unexpected token do '/test_2.sh: строка 10: `do - person Alex Brown; 15.04.2015

Основываясь на тегах вашей темы, я предполагаю, что вы используете ssh для входа на удаленные машины. Надеемся, что используемая вами машина основана на *nix, поэтому вы можете использовать следующий скрипт. Если вы работаете в Windows, подумайте о cygwin.

Сначала прочтите эту статью, чтобы настроить аутентификацию с открытым ключом на каждой удаленной цели: http://www.cyberciti.biz/tips/ssh-public-key-based-authentication-how-to.html

Это не позволит ssh предлагать вам вводить пароль каждый раз, когда вы входите в каждую цель. Затем вы можете написать сценарий выполнения команды для каждой цели примерно так:

#!/bin/bash

#kill script if we throw an error code during execution
set -e

#define hosts 
hosts=( 127.0.0.1 127.0.0.1 127.0.0.1)

#define associated user names for each host
users=( joe bob steve )

#counter to track iteration for correct user name
j=0

#iterate through each host and ssh into each with user@host combo
for i in ${hosts[*]}
do
  #modify ssh command string as necessary to get your script to execute properly
  #you could even add commands to transfer the file into which you seem to be dumping your results
  ssh ${users[$j]}@$i 'nohup Rscript L_1_cc.R > L_1_sh.txt'
  let "j=j+1"
done

#exit no error
exit 0

Если вы настроили аутентификацию с открытым ключом, вам нужно просто выполнить свой сценарий, чтобы каждый удаленный хост выполнял свою работу. Вы даже можете рассмотреть загрузку данных пользователей/хостов из файла, чтобы избежать жесткого кодирования этой информации в массивы.

person Kin3TiX    schedule 14.04.2015