我是一个完整的新手期待和谷歌和期待书上的所有发现我写了this代码,但仍然需要大约30-40分钟来执行一个任务超过一个IP地址。
现在,我希望代码内部循环,如下所示:
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"
}
}
迄今为止最简单的技术是将代码分成两个文件中的两个,其中一个是将与单个主机交互的代码(并将主机名称作为argv
变量中的命令行参数),以及另一个将跨多个主机管理事物。
最粗糙的管理器代码可能看起来像这样(我猜测编写和调试单个主机代码对你来说不会太难):
foreach host [ split $hosts "\;" ] {
exec expect perHostCode.tcl $host &
}
但是,当主机数量增加时会遇到问题。特别是,您可以执行的同时运行的数量受操作系统安装所具有的虚拟终端数量的限制。这通常比您可以一次运行的进程或线程数小得多。因此,如果您拥有大量主机,则需要限制一次执行的数量。