2016-06-19 13 views
1

主な質問:groovyの​​メソッドでは、ファイルを引数として取るコマンドを実行できますか?バックグラウンドモードでコマンドを実行することはできますか?Groovyのスクリプトは外部プロセスを実行できません

ここは私の問題です。私はGroovyの​​を、例えばlsのような単純なコマンドに使用することができました。ここでは、カッファのようなプロセスをgroovyスクリプトから始めたいとします(最終結果は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" 

上記のコマンドラインをそのまま出力します。しかし、グルーヴィーなスクリプト内からこのコマンドを実行する:

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

は、単純にハングアップ!そして、このしよう:これは上記と同じ例外を与えるしようと

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

::私は、それがバックグラウンド・プロセスがさらに進んで、しかし、入力ファイルに文句を開始し、この例外をスローします

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

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

どうしたらいいですか?ありがとうございました。

答えて

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

取得をプロセスからの出力およびエラー・ストリームを読み取り、それらを読み取って、完全な出力バッファーによってプロセスがブロックされないようにします。ストリームデータは廃棄されますが、完全な出力バッファによるブロックは回避されます。ストリームデータが破棄されるため、何か問題が発生したときに追跡するのが困難な場合があるため、標準またはエラー出力を気にせず、プロセスを静かに実行したい場合は、この方法を使用してください。このため、2つのスレッドが開始されるので、このメソッドはすぐに戻ります。

+0

これはうまくいきました。さて、余分なマイルを乗り越えて、これをバックグラウンドプロセスとして実行して、他のコマンドを後で実行できるようにしてはどうでしょうか? '' $ '$ zkStart $ zkPropsFile&" 'があるように'& 'を追加しましたが、うまくいきませんでした。あるいは、コードが、バックグラウンドで操作が実行される並行したロジックにまとめて、少しスリープ状態にして、別のスレッドで他のプロセスを実行する必要があるでしょうか? – mohsenmadi

+0

2つの行の後に 'sleep SOMETIME'を追加し、' Thread.start {...}。join() '句の中のすべての行をラップすると、次の文が正常に実行されたので望ましい結果が得られます。より良い方法がありますか? – mohsenmadi

関連する問題