java exec 获得输出,使用java在LINUX中执行命令并获取输出

本文探讨了使用Groovy在Linux环境中执行命令并获取输出时遇到的问题,特别是关于管道操作的不正确使用。作者通过示例代码展示了如何在Groovy中执行命令,但发现无法使用管道或者进程没有等待命令完成。解决方案提出使用`Process.pumpInput()`或Groovy的`|`操作符来实现命令管道。此外,还提供了更通用的方法来处理命令行输出和错误流。
摘要由CSDN通过智能技术生成

I am using Groovy to execute commands on my LINUX box and get back the output, but I am not able to use | pipes somehow (i think) or may be it is not waiting for the command to finish, what is wrong, or what am i missing in my code?

My Calling function

def test()

{

String result="N"

HashMap params = IntermediateResults.get("userparams")

Map env=AppContext.get(AppCtxProperties.environmentVariables)

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

List frows=["uname -a",

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

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

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

return result

}

Infa9CommandExecUtil.groovy file content Update added exitVal println

package infa9

import java.io.BufferedReader;

public class Infa9CommandExecUtil {

StringBuffer result

public Infa9CommandExecUtil() {

result = new StringBuffer()

}

public List fetchCommandOutput( Map params, Map env, List rows )

{

List outputRows = new ArrayList()

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

}

}

My Output *Update added exitVal value*

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

Update

Note: I am internally using sh -c

解决方案

You cannot do pipes or redirects using String.execute(). This doesn't work in Java, so it doesn't work in Groovy either...

You can use Process.pipeTo with Groovy to simplify things:

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

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

(proca | procb).text

A more generic version could be:

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 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值