mohsenmadi
mohsenmadi

Reputation: 2377

Groovy script can't execute() external process

Main question: Would groovy's execute() method allow me to run a command that takes a file as an argument, any maybe run the command in background mode?

Here is my issue. I was able to use groovy's execute() for simple commands like ls for example. Suppose now I want to start a process like Kafka from a groovy script (end result is to replace bash files with groovy scripts). So I start with these lines:

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"

Now, executing the command below form my mac terminal:

/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 

starts up the the process just fine. And, executing this statement:

println "$zkStart $zkPropsFile" 

prints the above command line as is. However, executing this command from within the groovy script:

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

simply hangs! And trying this:

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

where I make it a background process goes further, but starts complaining about the input file and throws this exception:

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

Trying this gives the same exception as above:

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

What am I missing please? Thank you.

Upvotes: 2

Views: 1606

Answers (1)

pczeus
pczeus

Reputation: 7868

Yes, try using the consumeProcessOutpusStream() method:

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

You can find the the method in the Groovy docs for the Process class: http://docs.groovy-lang.org/docs/groovy-1.7.2/html/groovy-jdk/java/lang/Process.html

Which states:

Gets the output and error streams from a process and reads them to keep the process from blocking due to a full output buffer. The stream data is thrown away but blocking due to a full output buffer is avoided. Use this method if you don't care about the standard or error output and just want the process to run silently - use carefully however, because since the stream data is thrown away, it might be difficult to track down when something goes wrong. For this, two Threads are started, so this method will return immediately.

Upvotes: 1

Related Questions