как да изпращате различни команди до множество хостове, за да стартирате програми в 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, така че да можете да влизате без да въвеждате парола (google за това, ако не знаете как). След това напишете скрипт за 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 teminal за влизане в различни компютри и да им изпращам различни команди, ако вече съм влязъл в linux от PuTTY? - person Alex Brown; 15.04.2015
comment
Да, просто стартирайте примерния скрипт (след модификация за вашите цели). Тоест, поставете горния код във файл (напр. my_run.sh) и след това стартирайте ./my_run.sh от вашата putty сесия. - person kaylum; 15.04.2015
comment
Не познавам Linux много добре. Можете ли да промените 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 и скриптове на shell. Това ще ви отведе много по-далеч в дългосрочен план, отколкото някой, който ви дава пълно решение на този проблем. - 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