在stdout
显示实时更新并且只将最后一行(tail -n 1 savefile
)保存到文件中时,是否仍然在后台运行流程?可以在同一时间运行1到15个测试,我需要能够看到测试正在运行,但我不想保存整个文本输出。
我应该提一下,因为测试是在后台运行我使用checkpid
循环来等待测试完成
如果它有助于我的脚本运行测试......
set runtest [exec -ignorestderr bsub -I -q lin_i make $testvar SEED=1 VPDDUMP=on |tail -n 1 >> $path0/runtestfile &]
我发现如果我使用| tee
会导致checkpid
循环跳过,但如果我|tee
它会显示输出。
答案 0 :(得分:0)
最好使用更简单的管道,在Tcl中显式管理输出处理,而不是使用tail -n
(和tee
)来模拟它。
set pipeline($testvar) [open |[list bsub -I -q lin_i make $testvar SEED=1 VPDDUMP=on]]
fileevent $pipeline($testvar) readable [list handleInput $testvar]
fconfigure $pipeline($testvar) -blocking 0
# The callback for when something is available to be read
proc handleInput {testvar} {
upvar ::pipeline($testvar) chan ::status($testvar) status
if {[gets $chan line] >= 0} {
# OK, we've got an update to the current status; stash in a variable
set status $line
# Echo to stdout
puts $line
return
} elseif {[eof $chan]} {
if {[catch {close $line}]} {
puts "Error from pipeline for '$testvar'"
}
unset chan
# I don't know if you want to do anything else on termination
return
}
# Nothing to do otherwise; don't need to care about very long lines here
}
此代码加上一点vwait
来启用基于事件的处理(假设您还没有使用Tk),可以让您从管道中读取,同时不会阻止您执行其他操作。您甚至可以立即启动多个管道; Tcl会很好地应对。更重要的是,在trace
数组上设置写入::status
可以让您一次监控所有管道的变化。