【问题标题】:How can I read (prinln) file in Groovy that another process writes into it如何在 Groovy 中读取另一个进程写入的(prinln)文件
【发布时间】:2015-02-27 10:53:15
【问题描述】:

我正在构建运行 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 打开并立即关闭文件。

【问题讨论】:

    标签: java groovy gradle


    【解决方案1】:

    您正在寻找的基本上是 tail -f &lt;file&gt; 在 unix 上的行为。因此,如果您有权使用此工具,那么一种明显的处理方法就是调用它(例如 ['tail', '-f', '&lt;file&gt;'].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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多