#!/bin/expect --
set vm_num [lindex $argv 0]
puts "``````````````````````````````````````````````````````````````"
puts "``````````````````````````````````````````````````````````````"
puts "Registering Stations on VM"
puts "Tarts to be Registered: $vm_num"
puts "``````````````````````````````````````````````````````````````"
puts "``````````````````````````````````````````````````````````````"
for { set index 0 } { $index < [llength $vm_num] } { incr index } {
puts "Registering Tart Num: [lindex $vm_num $index]"
switch -- [lindex $vm_num $index]\
1 {
spawn telnet 10.171.0.10 6187
set timeout -1
expect {
puts "``````````````````````````````````````````````````````````````"
"*traffic*" { puts "Registering Group1, Group2"
send "traffic map rate reg_group1 30000\r"
send "traffic map rate reg_group2 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group3, Group4"
send "traffic map rate reg_group3 30000\r"
send "traffic map rate reg_group4 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group5, Group6"
send "traffic map rate reg_group5 30000\r"
send "traffic map rate reg_group6 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group7, Group8"
send "traffic map rate reg_group7 30000\r"
send "traffic map rate reg_group8 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
}
puts "wait 3 seconds"
sleep 3
send -- "^]"
expect -exact "^\]\rtelnet> "
send -- "close\r"
expect eof
wait
}
} 2 {
spawn telnet 10.171.0.11 6187
set timeout -1
expect {
"*traffic*" {
puts "``````````````````````````````````````````````````````````````"
puts "Registering Group1, Group2"
send "traffic map rate reg_group1 30000\r"
send "traffic map rate reg_group2 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group3, Group4"
send "traffic map rate reg_group3 30000\r"
send "traffic map rate reg_group4 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group5, Group6"
send "traffic map rate reg_group5 30000\r"
send "traffic map rate reg_group6 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
puts "Registering Group7, Group8"
send "traffic map rate reg_group7 30000\r"
send "traffic map rate reg_group8 30000\r"
puts "wait 100 seconds .."
send "traffic go\r"
sleep 100
}
puts "wait 3 seconds"
sleep 3
send -- "^]"
expect -exact "^\]\rtelnet> "
send -- "close\r"
expect eof
wait
}
} 3 {
spawn telnet 10.171.0.12 6187
set timeout -1
expect {
"*traffic*" {
puts "``````````````````````````````````````````````````````````````"
puts "Registering Group1, Group2"
send "traffic map rate reg_group1 50000\r"
puts "wait 220 seconds .."
send "traffic go\r"
sleep 220
puts "Registering Group2"
send "traffic map rate reg_group2 50000\r"
puts "wait 220 seconds .."
send "traffic go\r"
sleep 220
}
puts "wait 3 seconds"
sleep 3
send -- "^]"
expect -exact "^\]\rtelnet> "
send -- "close\r"
expect eof
wait
}
}
default {
puts "$vm_num is not a valid tart"
}
}
누구든지 나를 안내할 수 있나요? 예를 들어 ./vmSetup.ex "1 2 3"과 같은 스크립트를 실행할 때 실행되는 위의 예상 스크립트가 있지만 이는 순차적으로 실행됩니다. 이 Expect 스크립트를 만들었지만 이제 스크립트의 사례(예: 1, 2, 3)를 병렬로 실행하고 싶습니다. 예를 들어 8개 사례를 병렬로 실행하는 방법을 알려주실 수 있나요? 그리고 비슷한 케이스 1~3을 사용하고 있는데 차이점은 IP뿐입니다. 제 주변에도 그런 경우가 25개 정도 있어요. 하나의 사례만 사용하여 25개의 VM을 모두 수용하는 방법을 알려주실 수 있나요?
답변1
가장 쉬운 방법은 다음에만 연결되도록 제외 스크립트를 다시 작성하는 것입니다.하나Machine, 명령줄에서 컴퓨터 이름이나 IP 주소를 가져옵니다.
그런 다음 다음 중 하나를 사용하여 스크립트를 실행하십시오.GNU 병렬또는 xargs -P
를 사용하면 xargs
더 간단한 병렬화 작업에 더 쉽게 사용할 수 있고 parallel
더 유연하며 더 복잡한 병렬화 요구 사항에 더 적합합니다.
예를 들어
echo 10.171.0.{10..17} | xargs -P 8 -n 1 /path/to/your/expect/script
그러면 최대 8개의 작업( -P 8
)이 동시에 실행되며 각 작업은 정확히 하나의( -n 1
) IP 주소를 지정합니다.
스크립트에서 많은 출력이 생성될 것으로 예상되는 경우 표준 출력으로 인쇄하지 않고 별도의 로그 파일(예: IP 주소 사용 expect-10.171.0.10.log
)로 인쇄하도록 스크립트를 작성하는 것이 좋습니다. 그렇지 않으면 모든 작업의 출력이 다음과 같이 됩니다. 함께 섞였습니다.
최소한 각 출력 줄은 IP 주소와 콜론을 각 줄의 접두사로 지정하여 해당 출력이 나오는 시스템을 식별해야 합니다.
추가 댓글:
가능하다면 비밀번호 인증 대신 키 기반 인증을 사용하도록 구성하고 다음을 수행해야
ssh
합니다telnet
.- 당신은 필요하지 않습니다
expect
- 병렬 분산 쉘을 사용할 수 있습니다PDSH원격 시스템에 연결(pdsh는 기본적으로 병렬로 연결)
스크립트
expect
를 좀 더 생각해 보면 ssh가 적합하지 않을 수 있습니다.- 당신은 필요하지 않습니다
아니면 일부 라우터에서 데이터를 수집하려는 것으로 보입니까?
이 경우,간단한 네트워크 관리 프로토콜더 적합할 수도 있습니다. SNMP(및 기타 소스)를 통해 수집된 데이터를 수집, 저장 및 플롯하는 기존 도구가 이미 많이 있습니다. 예를 들어,선인장,크리켓,무닌및 기타 사용되는 도구RRD 도구.