0

私は完全な初心者であり、Google ですべての調査結果と本を期待した後、このコードを書きましたが、単一の IP アドレスでタスクを実行するには約 30 ~ 40 分かかります。

今、私は次のような for ループ内のコードを期待しています:

   foreach  host [ split $hosts "\;" ] {
      #blah blah blah

      #more code

      expect -re "$prompt"
      send -- "exit\r"
   }

並列処理のためにバックグラウンドで各ホストに対してこれを実行する必要があります

これを行うにはどうすればよいですか:

   foreach  host [ split $hosts "\;" ] {
    {
      #blah blah blah

      #more code

      expect -re "$prompt"
      send -- "exit\r"
    } &
   }

待つ

また、各プロセスが同時に同じファイルに書き込もうとする可能性があるため、ログ ファイルが文字化けしないようにするにはどうすればよいですか。

編集: SendCommands という関数を使用して、次のようなバッファをログ ファイルに入れるコマンドを送信しました。

proc SendCommands { Commands } {
        global prompt log errlog
                foreach element [split $Commands ";"] {
                        expect {
                               -re $prompt
                                {send -- "$element\r"}
                               }
        set outcome "$expect_out(buffer)"
        puts "$log" "$outcome"
         }
}
4

1 に答える 1

2

最も簡単な方法は、コードを 2 つのファイルに分割することです。そのうちの 1 つは、単一のホストと対話するコード (ホストの名前をargv変数のコマンド ライン パラメータとして受け取るコード) です。他のものは、複数のホストにわたって物事を管理します。

最も粗雑なマネージャー コードは次のようになります (1 つのホスト コードを記述してデバッグすることは、それほど難しくないと思います)。

foreach host [ split $hosts "\;" ] {
    exec expect perHostCode.tcl $host &
}

ただし、ホストの数が増えると問題が発生します。特に、実行できる expect の同時実行数は、OS インストールにある仮想端末の数によって制限されます。これは、通常、一度に実行できるプロセスまたはスレッドの数よりもはるかに少なくなります。したがって、ホストが多数ある場合は、一度に行う数を制限する必要があります。

于 2013-04-14T08:06:51.393 に答える