当前位置: 首页 > 面试题库 >

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

戚飞雨
2023-03-14
问题内容

我正在使用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 )


 类似资料:
  • 问题内容: 在node.js中,我想找到一种方法来获取Unix终端命令的输出。有什么办法吗? 问题答案: 那就是我现在正在工作的项目中这样做的方式。 示例:检索git用户

  • 在一个节点中。js,我想找到一种获取Unix终端命令输出的方法。有没有办法做到这一点?

  • 问题 你想执行一个外部命令并以Python字符串的形式获取执行结果。 解决方案 使用 subprocess.check_output() 函数。例如: import subprocess out_bytes = subprocess.check_output(['netstat','-a']) 这段代码执行一个指定的命令并将执行结果以一个字节字符串的形式返回。 如果你需要文本形式返回,加一个解码步

  • 问题内容: 我正在使用运行时从Java程序运行命令提示符命令。但是,我不知道如何获得命令返回的输出。 这是我的代码: 我尝试做,;但是没有返回任何东西。该命令的执行应返回两个数字,以分号分隔。我怎样才能在变量中打印出来? 这是我现在使用的代码: 但是我没有得到任何输出,但是当我自己运行该命令时,它可以正常工作。 问题答案: 这是要走的路:

  • 问题内容: 我正在尝试从Java执行SOX命令,但不幸的是,它每次都会返回错误。其他所有SOX命令都可以正常运行!!这是代码: 当我在终端中执行相同的sox命令时,它的工作正常。我真的不明白问题是什么!是因为“ |” 符号?? 问题答案: 问题是Runtime.exec()无法理解shell概念,例如“ |”。而是尝试: 问题是exec直接运行二进制文件而不调用shell。“ |” 字符只能被外壳

  • 问题内容: 我可以在node.js中运行bash命令,如下所示: 如何获得该命令的退出代码(在此示例中)?我试过跑步 尽管如此,无论上一个命令的退出代码如何,它总是返回0。我想念什么? 问题答案: 这两个命令在单独的shell中运行。 要获取代码,您应该能够签入回调。 如果这不起作用,则需要添加一个事件处理程序 例如