2012-05-14 10 views
3

私はコマンドを実行してstdoutとstderrをログファイルにコピーするのが好きです。私が実行したいとグルーヴィーティーはどうやって作りますか?

:標準出力/標準エラー出力をログファイルを言わためにコピーされる差が

p = "ls -l /tmp/".execute() 

p = myexecute("ls -l /tmp/") 

そして、本質的には同じProcessオブジェクトは、として戻ってきました。私はgroovyでこれを行う簡単な方法があると確信していますが、私はそれを見てまだ十分なグルーヴィーではありません。

答えて

0

そうだね、それは簡単です:

logFile.withWriter('UTF-8') { sout -> 
    p = "ls -l /tmp/".execute() 
    p.consumeProcessOutput(sout, sout) 
} 

これは、同じファイルに両方のストリームを書き込みます。より多くの例については

http://groovy.codehaus.org/Process+Management

+0

ああ、それはクールです!しかし、私が欲しいものではない、申し訳ありませんが私は私の質問で不明だった場合。私はストリームで "聴いて"、それらを消費せずにファイルにコピーするのが好きです。これはunixコマンド[tee](http://en.wikipedia.org/wiki/Te_(command))のようです。 – Spotty

+1

これは簡単です:独自の 'FilterWriter'を実装し、それに' sout'をラップします。 –

1

よりよい解決策があるかもしれない参照してください。このよう

def logFile = new File('/tmp/log.txt') 
logFile.withWriter('UTF-8') { sout -> 
    p = "ls -l /tmp/".execute() 
    p.waitForProcessOutput(sout, sout) 
} 

+0

もちろん、これはApacheのコモンズからの[TeeOutputStream](http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html)のようなものに加えて、より完全かもしれませんあなたはおそらく後のソリューションです... –

1

を完了するために、プロセスを待ちます。この答えは長年の懸案であるが、一つの解決策はできますbe:

import groovy.ui.SystemOutputInterceptor 

File logFile = new File('stdout.log')                     
new SystemOutputInterceptor({logFile << it; true}).start() 
... 
関連する問題