使用Java在Linux中执行命令并获取输出

我正在使用Groovy在我的Linux机器上执行命令并返回输出,但是我无法以|某种方式使用管道(我认为),或者它可能没有在等待命令完成。

有什么问题或我的代码中缺少什么?

我的调用函数:

def test()

{

String result="N"

HashMap<String,String> params = IntermediateResults.get("userparams")

Map env=AppContext.get(AppCtxProperties.environmentVariables)

def fClass = new GroovyClassLoader().parseClass( new File( 'plugins/infa9/Infa9CommandExecUtil.groovy' ) )

List<String> frows=["uname -a",

"uname -a | awk '{print\$2}'",

"uname -a | cut -d ' ' -f 2"]

List<String> resultRows = fClass.newInstance().fetchCommandOutput( params, env, frows )

return result

}

Infa9CommandExecUtil.groovy 文件内容(更新:添加了exitVal println):

package infa9

import java.io.BufferedReader;

public class Infa9CommandExecUtil {

StringBuffer result

public Infa9CommandExecUtil() {

result = new StringBuffer()

}

public List<String> fetchCommandOutput( Map<String,String> params, Map env, List<String> rows )

{

List<String> outputRows = new ArrayList<String>()

try

{

for(item in rows)

{

String temp=item.toString()

println "CMD:$temp"

Process proc = Runtime.getRuntime().exec(temp);

InputStream stdin = proc.getInputStream();

InputStreamReader isr = new InputStreamReader(stdin);

BufferedReader br = new BufferedReader(isr);

String line = null;

result = new StringBuffer()

line=null

int exitVal = proc.waitFor() //do I need to wait for the thread/process to finish here?

while ((line = br.readLine()) != null)

{

result.append(line+System.getProperty("line.separator")) //to maintain the format (newlines)

}

String tRes=result

tRes=tRes.trim()

println "OUTPUT:$tRes\nEXITVAL:$exitVal"

outputRows.add(tRes)

}

}

catch (IOException io) { io.printStackTrace();}

catch (InterruptedException ie) {ie.printStackTrace();}

return outputRows

}

}

我的输出(更新:添加了exitVal值):

CMD:uname -a

OUTPUT:Linux estilo 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux

EXITVAL:0

CMD:uname -a | awk '{print$2}'

OUTPUT:

EXITVAL:1

CMD:uname -a | cut -d ' ' -f 2

OUTPUT:

EXITVAL:1

注意:我在内部使用sh -c <command>

回答:

您不能使用进行管道或重定向String.execute()。这在Java中不起作用,因此在Groovy中也不起作用…

您可以Process.pipeTo与Groovy一起使用以简化操作:

Process proca = 'uname -a'.execute()

Process procb = 'awk {print\$2}'.execute()

(proca | procb).text

更通用的版本可能是:

String process = 'uname -a | awk {print\$2}'

// Split the string into sections based on |

// And pipe the results together

Process result = process.tokenize( '|' ).inject( null ) { p, c ->

if( p )

p | c.execute()

else

c.execute()

}

// Print out the output and error streams

result.waitForProcessOutput( System.out, System.out )

以上是 使用Java在Linux中执行命令并获取输出 的全部内容, 来源链接: utcz.com/qa/434037.html

回到顶部