主要问题: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
我错过了什么?谢谢您。
1条答案
按热度按时间tcbh2hod1#
是的,试着用
consumeProcessOutpusStream()
方法:您可以在groovy文档中找到
Process
班级:http://docs.groovy-lang.org/docs/groovy-1.7.2/html/groovy-jdk/java/lang/process.html其中规定:
从进程获取输出和错误流,并读取它们以防止进程由于输出缓冲区已满而阻塞。流数据被丢弃,但避免了由于输出缓冲区已满而造成的阻塞。如果您不关心标准输出或错误输出,只希望进程以静默方式运行,请使用此方法—但是请小心使用,因为由于流数据被丢弃,因此在出现问题时可能很难跟踪。为此,将启动两个线程,因此此方法将立即返回。