Groovyで子プロセス起動
gantのソース見ていて気付いたわけだけど、文字列配列とか、文字列に対して、execute()を実行すれば良いようだ。Groovy JDKにも載っているね。Groovy JDKではString[]というのが、1つのエントリになっているのか。
gantのソースを元に作成すると、こんな感じになるんだけど、
def process = ['ls', '-l', '/etc'].execute()
//def process = 'ls -l /etc'.execute()
process.err.eachLine {println it}
process.in.eachLine {System.err.println it}
def ret = process.waitFor()
確かに、これはLinuxだと、一見問題無く動く。でもWindowsだとハングする。これってストリームが詰まる問題だよね。Linuxはストリームのバッファが、かなり大きいようで問題が顕在化しないだけじゃないかな。
Thread.start {
process.err.eachLine {println it}
}
とすれば良さそうだ。簡単に書けていいんだけどさ、クロージャ経由って、Javaメモリモデルの問題とか、どうなるんだか、さっぱり見えないから。なんか怖い。





