groovy脚本无法执行()外部进程

e3bfsja2  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(356)

主要问题:groovy的 execute() 方法允许我运行一个以文件为参数的命令,是否可以在后台模式下运行该命令?
这是我的问题。我能用groovy的 execute() 对于简单的命令,例如 ls 例如。假设现在我想从groovy脚本开始一个类似kafka的过程(最终结果是替换 bash 包含groovy脚本的文件)。所以我从以下几行开始:

def kafkaHome = "Users/mememe/kafka_2.11-0.9.0.1"
def zkStart = "$kafkaHome/bin/zookeeper-server-start.sh" 
def zkPropsFile = "$kafkaHome/config/zookeeper.properties"

现在,从我的mac终端执行以下命令:

/Users/mememe/kafka_2.11-0.9.0.1/bin/zookeeper-server-start.sh /Users/mememe/kafka_2.11-0.9.0.1/config/zookeeper.properties

启动过程很好。执行以下语句:

println "$zkStart $zkPropsFile"

按原样打印上面的命令行。但是,在groovy脚本中执行以下命令:

println "$zkStart $zkPropsFile".execute().text

就这么挂了!试着这样做:

println "$zkStart $zkPropsFile &".execute().text

我将其设为后台进程的地方更进一步,但开始抱怨输入文件并引发以下异常:

java.lang.NumberFormatException: For input string: "/Users/mememe/kafka_2.11-0.9.0.1/config/zookeeper.properties"

尝试此操作会产生与上述相同的异常:

def proc = ["$zkStart", "$zkPropsFile", "&"].execute()
println proc.text

我错过了什么?谢谢您。

tcbh2hod

tcbh2hod1#

是的,试着用 consumeProcessOutpusStream() 方法:

def os = new File("/some/path/toyour/file.log").newOutputStream()
"$zkStart $zkPropsFile".execute().consumeProcessOutputStream(os)

您可以在groovy文档中找到 Process 班级:http://docs.groovy-lang.org/docs/groovy-1.7.2/html/groovy-jdk/java/lang/process.html
其中规定:
从进程获取输出和错误流,并读取它们以防止进程由于输出缓冲区已满而阻塞。流数据被丢弃,但避免了由于输出缓冲区已满而造成的阻塞。如果您不关心标准输出或错误输出,只希望进程以静默方式运行,请使用此方法—但是请小心使用,因为由于流数据被丢弃,因此在出现问题时可能很难跟踪。为此,将启动两个线程,因此此方法将立即返回。

相关问题