运行 一个 tcl 脚本的多个实例
Running multiple instances of one tcl script
目前我正在使用 foreach 命令从文件中读取主机名,并使用此主机名连接到设备。所有这些都是在我的 TCL 脚本中完成的。有没有办法 运行 脚本的多个实例,以便分别查询每个设备?类似 bash 的脚本类似于:
for hostname in file;
do
log.tcl $hostname &
done
我相信这类似于多线程。
我的另一个问题是,当 运行 一个脚本的多个实例,并且每个脚本都写入同一个文件时,所有的日志是否会被打乱?
有几个选项可以存档:
1。为每个主机名执行脚本:
foreach hostname $hosts {
exec log.tcl $hostname &
}
这类似于 bash 解决方案。
2。使用线程
package require Thread
set pool [tpool::create]
set jobs {}
foreach hostname $hosts {
lappend jobs [tpool::post -nowait $pool [list apply {{host} {
set argv0 log.tcl
set argv [list $host]
source $argv0
} $hostname]]
}
while {[llength $jobs]} {
tpool::wait $pool $jobs jobs
}
请注意,expect 不能很好地处理线程。
关于从多个脚本写入同一文件的其他问题:视情况而定。如果您有 POSIX 兼容系统并使用 a
打开文件,那么它可能会工作。
目前我正在使用 foreach 命令从文件中读取主机名,并使用此主机名连接到设备。所有这些都是在我的 TCL 脚本中完成的。有没有办法 运行 脚本的多个实例,以便分别查询每个设备?类似 bash 的脚本类似于:
for hostname in file;
do
log.tcl $hostname &
done
我相信这类似于多线程。 我的另一个问题是,当 运行 一个脚本的多个实例,并且每个脚本都写入同一个文件时,所有的日志是否会被打乱?
有几个选项可以存档:
1。为每个主机名执行脚本:
foreach hostname $hosts {
exec log.tcl $hostname &
}
这类似于 bash 解决方案。
2。使用线程
package require Thread
set pool [tpool::create]
set jobs {}
foreach hostname $hosts {
lappend jobs [tpool::post -nowait $pool [list apply {{host} {
set argv0 log.tcl
set argv [list $host]
source $argv0
} $hostname]]
}
while {[llength $jobs]} {
tpool::wait $pool $jobs jobs
}
请注意,expect 不能很好地处理线程。
关于从多个脚本写入同一文件的其他问题:视情况而定。如果您有 POSIX 兼容系统并使用 a
打开文件,那么它可能会工作。