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

时间:2016-06-19 00:34:39

标签: shell groovy command-line apache-kafka

主要问题:groovy的execute()方法是否允许我运行一个以文件为参数的命令,是否可以在后台模式下运行命令?

这是我的问题。我能够使用groovy的execute()来处理像ls这样的简单命令。假设现在我想从一个groovy脚本开始像Kafka这样的进程(最终结果是用groovy脚本替换bash文件)。所以我从这些方面开始:

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

我错过了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

是的,请尝试使用consumeProcessOutpusStream()方法:

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

您可以在Process类的Groovy文档中找到该方法: http://docs.groovy-lang.org/docs/groovy-1.7.2/html/groovy-jdk/java/lang/Process.html

哪个州:

  

从进程获取输出和错误流并读取它们以防止进程因完整输出缓冲区而阻塞。丢弃流数据但避免了由于完整输出缓冲而导致的阻塞。如果您不关心标准或错误输出并且只是希望进程以静默方式运行,请使用此方法 - 但请谨慎使用,因为流数据被丢弃后,可能很难在出现问题时进行跟踪。为此,启动了两个Thread,因此该方法将立即返回。