予想されるスクリプトを順次ではなく並列に実行するには?

予想されるスクリプトを順次ではなく並列に実行するには?
#!/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個ほどあります。 1つのケースのみを使用して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)が同時に実行され、各ジョブは正確に1つの(-n 1)IPアドレスを指定します。

スクリプトが多数の出力を生成すると予想される場合は、標準出力として印刷するのではなく、別のログファイル(IPアドレスなどexpect-10.171.0.10.log)で印刷するようにスクリプトを作成することをお勧めします。それ以外の場合、すべてのジョブの出力は次のようになります。一緒に混ぜました。

少なくとも各出力行は、IPアドレスとコロンを各行の接頭辞として指定して、その出力が出てくるシステムを識別する必要があります。


追加コメント:

  1. 可能であれば、パスワード認証ではなくキーベース認証を使用するように設定し、次の手順を実行する必要がありsshますtelnet

    • あなたは必要ありませんexpect
    • 並列分散シェルを使用できますPDSHリモートシステムに接続する(pdshはデフォルトで並列に接続)

    スクリプトexpectをもう少し考えてみると、sshが適していない可能性があります。

  2. それとも、一部のルーターからデータを収集したいと思いますか?

    この場合、シンプルなネットワーク管理プロトコルより適切かもしれません。 SNMP(および他のソース)を介して収集されたデータを収集、保存、およびプロットするための既存のツールはすでにたくさんあります。例えば、サボテンクリケットムニンその他の使用ツールRRDツール

おすすめ記事