写入stdout,但将tail -n 1保存到文件中

时间:2015-06-23 15:55:02

标签: tcl exec pid tail tee

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它会显示输出。

1 个答案:

答案 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可以让您一次监控所有管道的变化。