我如何读取 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.