用groovy过程读取tail-f输出

时间:2011-04-20 14:17:39

标签: groovy process

嗨我想用一个groovy过程读一下tail -f一段时间,然后拿走我从中得到的东西并破坏这个过程。我是在“守望者级”设置中进行的(即我在测试开始时执行该过程,并希望在测试完成后获取数据)。

问题是我没有从流程中获得任何内容(process.in.text),即使已经将大量内容写入我正在阅读的文件中。

我曾试图看看是否有人曾经尝试过,但在这件事上找不到任何好的资源。

以下是测试守望者开始和结束时的一些代码:


  @Override
    void starting(FrameworkMethod method) {
        if (testCase.logs) {
            println "===> Fetching logs enabled."
            def commands = []
            pathMap.each {key, value ->
                String host = environmentEnvName.toLowerCase() + key.toString()
                value.each {it ->
                    commands.add "ssh ${user}@${host} tail -f '${it}'"
                }
            }
            println "===> Executing processes"
            commands.each {command ->
                procs.add command.execute()
            }
            println "===> ${procs.size()} processes exceuted"
        }
    }


    @Override
    void finished(FrameworkMethod method) {
        if (procs) {
            println "===> Ready to write files and destroy processes."

            def reportDate = new Date()
            procs?.eachWithIndex {proc, index ->
                def target = String.format("%s/target/${index}-%s.txt", userdir, reportDate.format("HHmm-ddMMyyyy"))
                if(proc.in.text){
                    new File(target).write(proc.in.text)
                }
                proc.destroy()
            }

            println "===> Log exerpts written. Processes destroyed."

        }
    }

1 个答案:

答案 0 :(得分:3)

Process.getText()InputSteam.getText()在返回之前完全读取输入,如果您销毁进程,则不一定返回任何内容。你可以通过逐行读取输出,或者直接将流传递给输出文件来解决这个问题:

proc.in.newReader().eachLine { line ->
    // do something with line
}
// or
new File(target) << proc.in

顺便说一句,tail -f通常是交互式使用,而不是程序。如果你想在测试之前和之后设置一个日志文件的增量,那么在之前获取文件大小会更加简单,然后重新打开文件并寻找旧的并从那里开始阅读。