嗨我想用一个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."
}
}
答案 0 :(得分:3)
Process.getText()
和InputSteam.getText()
在返回之前完全读取输入,如果您销毁进程,则不一定返回任何内容。你可以通过逐行读取输出,或者直接将流传递给输出文件来解决这个问题:
proc.in.newReader().eachLine { line ->
// do something with line
}
// or
new File(target) << proc.in
顺便说一句,tail -f
通常是交互式使用,而不是程序。如果你想在测试之前和之后设置一个日志文件的增量,那么在之前获取文件大小会更加简单,然后重新打开文件并寻找旧的并从那里开始阅读。