0

我是一个完全的新手,在谷歌和期待书中的所有发现之后,我编写了这段代码,但仍然需要大约 30-40 分钟才能通过单个 IP 地址执行任务。

现在我来期待这样的 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

到目前为止,最简单的技术是将您的代码拆分为两个文件中的两部分,其中之一是将与单个主机交互的代码(并将主机名称作为argv变量中的命令行参数),以及其他将跨多个主机管理事物。

最粗略的管理器代码可能看起来像这样(我猜编写和调试单个主机代码对您来说不会太难):

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

但是,当主机数量增加时,这会遇到问题。特别是,您可以同时运行的 expect 数量受到操作系统安装所具有的虚拟终端数量的限制。这通常远小于您可以一次运行的进程或线程数。因此,如果您有很多主机,则需要限制一次执行的次数。

于 2013-04-14T08:06:51.393 回答