예상 스크립트를 순차적이 아닌 병렬로 실행하는 방법은 무엇입니까?

예상 스크립트를 순차적이 아닌 병렬로 실행하는 방법은 무엇입니까?
#!/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 주소와 콜론을 각 줄의 접두사로 지정하여 해당 출력이 나오는 시스템을 식별해야 합니다.


추가 댓글:

  1. 가능하다면 비밀번호 인증 대신 키 기반 인증을 사용하도록 구성하고 다음을 수행해야 ssh합니다 telnet.

    • 당신은 필요하지 않습니다expect
    • 병렬 분산 쉘을 사용할 수 있습니다PDSH원격 시스템에 연결(pdsh는 기본적으로 병렬로 연결)

    스크립트 expect를 좀 더 생각해 보면 ssh가 적합하지 않을 수 있습니다.

  2. 아니면 일부 라우터에서 데이터를 수집하려는 것으로 보입니까?

    이 경우,간단한 네트워크 관리 프로토콜더 적합할 수도 있습니다. SNMP(및 기타 소스)를 통해 수집된 데이터를 수집, 저장 및 플롯하는 기존 도구가 이미 많이 있습니다. 예를 들어,선인장,크리켓,무닌및 기타 사용되는 도구RRD 도구.

관련 정보