Jenkins 有没有办法将长Groovy execute()命令的输出流式传输到控制台,而不是等待它完成?

Jenkins 有没有办法将长Groovy execute()命令的输出流式传输到控制台,而不是等待它完成?,jenkins,groovy,jenkins-groovy,Jenkins,Groovy,Jenkins Groovy,我正在通过系统Groovy脚本运行shell命令。这是一个长时间运行的过程,大约30分钟,而且相当冗长。但正如所写的,这将在打印stdout或stderr之前等待命令完成。有没有一种方法可以让输出在脚本执行时转到控制台(就像在终端会话中一样) 更新:这是我根据答案尝试的代码。在进程完成或终止之前,它不会打印任何内容 def cmd = "/home/adam/test.sh" StringBuffer sout = new StringBuffer() StringBuffer serr = n

我正在通过系统Groovy脚本运行shell命令。这是一个长时间运行的过程,大约30分钟,而且相当冗长。但正如所写的,这将在打印stdout或stderr之前等待命令完成。有没有一种方法可以让输出在脚本执行时转到控制台(就像在终端会话中一样)

更新:这是我根据答案尝试的代码。在进程完成或终止之前,它不会打印任何内容

def cmd = "/home/adam/test.sh"
StringBuffer sout = new StringBuffer()
StringBuffer serr = new StringBuffer()
def process = cmd.execute()
process.waitForProcessOutput sout, serr
sout.each 
   println "Line ${it}"
}

这就是我找到的解决办法

proc.in.eachLine { line -> println line }
proc.out.close()
proc.waitFor()

这就是我找到的解决办法

proc.in.eachLine { line -> println line }
proc.out.close()
proc.waitFor()

虽然您找到的解决方案可能会很好地工作,但我认为最好使用它,它还允许流化进程的错误输出

完整的解决方案如下:

#!/usr/bin/env groovy
Process proc = "ping -c 10 google.com".execute()
proc.waitForProcessOutput(System.out, System.err)
System.exit(proc.exitValue())
例如,有几种替代方法可以仅捕获正常输出或仅捕获错误输出。你可以找到他们


还有一章(相当短)是关于在上执行外部进程的。

虽然您找到的解决方案可能会很好地工作,但我认为最好使用它,它还允许流式传输进程的错误输出

完整的解决方案如下:

#!/usr/bin/env groovy
Process proc = "ping -c 10 google.com".execute()
proc.waitForProcessOutput(System.out, System.err)
System.exit(proc.exitValue())
例如,有几种替代方法可以仅捕获正常输出或仅捕获错误输出。你可以找到他们


还有一章(相当短)是关于在上执行外部进程的。

经过长时间的搜索,我无法得到确切的解决方案。这对我很有用:

public int Execute(def command, File dir) {
          println("command: ${command}")
          Process process = command.execute(null, dir)
          def out = new StringBuffer()
          def err = new StringBuffer()
          process.consumeProcessOutput(out, err)
          while(1) {
              err.eachLine {line, count ->
                  println("${line}")
                  err.setLength(0)
              }
              out.eachLine { line, count ->
                  println("${line}")
                  out.setLength(0)
              }
              if(! process.isAlive()) {
                  break
                  }
              }
         return process.exitValue()
         }

经过长时间的搜索,我无法得到确切的答案。这对我很有用:

public int Execute(def command, File dir) {
          println("command: ${command}")
          Process process = command.execute(null, dir)
          def out = new StringBuffer()
          def err = new StringBuffer()
          process.consumeProcessOutput(out, err)
          while(1) {
              err.eachLine {line, count ->
                  println("${line}")
                  err.setLength(0)
              }
              out.eachLine { line, count ->
                  println("${line}")
                  out.setLength(0)
              }
              if(! process.isAlive()) {
                  break
                  }
              }
         return process.exitValue()
         }

waitForProcessOutput()是否会等到进程完成后才可以使用输出?否,它会立即输出,但会阻塞,直到进程完成。所以你总是会得到完整的输出。我想我缺少的部分是如何打印进程正在运行的输出。给出下面的代码,它不会打印任何东西,直到我杀死“test.sh”脚本,它只是无休止地循环打印日期,并休眠30秒。def cmd=“/home/adam/test.sh”StringBuffer sout=new StringBuffer()StringBuffer serr=new StringBuffer()def process=cmd.execute()process.waitForProcessOutput sout,serr sout.each{println”Line${it}我更改了代码。上一次可能有错误。我自己也试过新的。它输出每一行
ping
返回并在进程终止后终止。您介意共享用于打印流的一条或多条语句吗?waitForProcessOutput()是否等待进程完成后才可用?否,它会立即输出,但会阻塞,直到进程完成。所以你总是会得到完整的输出。我想我缺少的部分是如何打印进程正在运行的输出。给出下面的代码,它不会打印任何东西,直到我杀死“test.sh”脚本,它只是无休止地循环打印日期,并休眠30秒。def cmd=“/home/adam/test.sh”StringBuffer sout=new StringBuffer()StringBuffer serr=new StringBuffer()def process=cmd.execute()process.waitForProcessOutput sout,serr sout.each{println”Line${it}我更改了代码。上一次可能有错误。我自己也试过新的。它输出每一行
ping
返回,并在进程终止后终止。您介意共享用于打印流的一条或多条语句吗?