我如何读取 Groovy 中另一个进程写入的 (prinln) 文件
How can I read (prinln) file in Groovy that another process writes into it
我正在构建运行 Tomcat 的 Gradle 脚本(可惜我不能使用 Gretty 或 Cargo 插件)。启动 Tomcat ($TOMCAT_HOME/bin/startup.sh
) 后,我想在 Gradle/Groovy 中打开文件,然后打印所有进来的行,换句话说:打开文件,跟踪 smt new 是否来了,打印它。
现在我的任务是这样的:
task startTomcat(dependsOn: ...) << {
def catalinaOut = "${project.TOMCAT_HOME}/logs/catalina.out"
delete { catalinaOut }
exec {
workingDir '.'
executable "${project.TOMCAT_HOME}/bin/${tomcatStartScript()}"
environment CATALINA_OPTS: tomcatArgs.join(' ')
}
new File(catalinaOut).eachLine { line -> println(line) }
}
当然不行,因为new File
打开并立即关闭文件。
你要找的基本上是 tail -f <file>
在 unix 上的行为。因此,如果您有权访问此工具,那么处理此问题的一种明显方法就是调用它(例如 ['tail', '-f', '<file>'].execute()
)。
否则 Java IO implementation of unix/linux "tail -f" 有几个答案。
所以这是一个使用 apache commons-io Tailer
:
的简单示例
buildscript {
repositories.jcenter()
dependencies {
classpath 'commons-io:commons-io:2.4'
}
}
task tail << {
def tailer = new org.apache.commons.io.input.Tailer(
"/tmp/mylog" as File,
[handle: { String l -> println l }] as org.apache.commons.io.input.TailerListenerAdapter
)
try {
tailer.run()
}
finally {
tailer.stop()
}
}
运行 和 gradle tail
并向提到的文件 /tmp/mylog
添加行。停止 CTRL-C
.
我正在构建运行 Tomcat 的 Gradle 脚本(可惜我不能使用 Gretty 或 Cargo 插件)。启动 Tomcat ($TOMCAT_HOME/bin/startup.sh
) 后,我想在 Gradle/Groovy 中打开文件,然后打印所有进来的行,换句话说:打开文件,跟踪 smt new 是否来了,打印它。
现在我的任务是这样的:
task startTomcat(dependsOn: ...) << {
def catalinaOut = "${project.TOMCAT_HOME}/logs/catalina.out"
delete { catalinaOut }
exec {
workingDir '.'
executable "${project.TOMCAT_HOME}/bin/${tomcatStartScript()}"
environment CATALINA_OPTS: tomcatArgs.join(' ')
}
new File(catalinaOut).eachLine { line -> println(line) }
}
当然不行,因为new File
打开并立即关闭文件。
你要找的基本上是 tail -f <file>
在 unix 上的行为。因此,如果您有权访问此工具,那么处理此问题的一种明显方法就是调用它(例如 ['tail', '-f', '<file>'].execute()
)。
否则 Java IO implementation of unix/linux "tail -f" 有几个答案。
所以这是一个使用 apache commons-io Tailer
:
buildscript {
repositories.jcenter()
dependencies {
classpath 'commons-io:commons-io:2.4'
}
}
task tail << {
def tailer = new org.apache.commons.io.input.Tailer(
"/tmp/mylog" as File,
[handle: { String l -> println l }] as org.apache.commons.io.input.TailerListenerAdapter
)
try {
tailer.run()
}
finally {
tailer.stop()
}
}
运行 和 gradle tail
并向提到的文件 /tmp/mylog
添加行。停止 CTRL-C
.