首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从运行在Cubieboard平台内的java代码中执行终端命令中获得输出

从运行在Cubieboard平台内的java代码中执行终端命令中获得输出
EN

Stack Overflow用户
提问于 2014-01-09 11:39:46
回答 2查看 4.9K关注 0票数 3

在Linux中运行终端命令并在java程序中获取输出的代码如下:

代码语言:javascript
复制
public static String execute(String command) {
    StringBuilder sb = new StringBuilder();
    String[] commands = new String[]{"/bin/sh", "-c", command};
    try {
        Process proc = new ProcessBuilder(commands).start();
        BufferedReader stdInput = new BufferedReader(new
                InputStreamReader(proc.getInputStream()));

        BufferedReader stdError = new BufferedReader(new
                InputStreamReader(proc.getErrorStream()));

        String s = null;
        while ((s = stdInput.readLine()) != null) {
            sb.append(s);
            sb.append("\n");
        }

        while ((s = stdError.readLine()) != null) {
            sb.append(s);
            sb.append("\n");
        }
    } catch (IOException e) {
        return e.getMessage();
    }
    return sb.toString();
}

现在的问题是,它适用于像ls /这样的普通命令,并返回适当的结果。但我的目标是运行以下命令:

代码语言:javascript
复制
echo 23 > /sys/class/gpio/export

例如,用于激活CubieBoard平台中的gpio引脚。(Cubieboard是一款小型pc板,类似于Raspberry Pi)。

现在,在系统本身的终端中运行这个命令,工作正常,并给出适当的结果。但是,当我从这个java代码运行它时,我无法得到任何结果。

关键是,它工作正常,命令执行得很好,但我无法获得命令的输出消息!

例如,如果引脚是从过去活动的,那么通常它应该返回结果如下:

代码语言:javascript
复制
bash: echo: write error: Device or resource busy

但是,当我通过上面的java代码运行这个命令时,我不会得到任何响应。(它再次生效,但仅仅是终端的响应,我无法得到!)

当我运行代码时,代码中的stdInputstdError变量都有值null。:(

请帮助我,以便我能完成我的项目。这是唯一剩下的部分:(

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-10 15:42:23

代码是对的,就在第二行,我更改了

代码语言:javascript
复制
"/bin/sh" to "/bin/bash"

一切都正常!

sh == bash?

很长一段时间以来,/bin/sh常常指向大多数GNU/Linux系统上的/bin/bash。因此,忽略两者之间的差异几乎变得安全了。但这种情况最近开始改变。

一些流行的/bin/sh不指向/bin/bash的系统示例(其中一些/bin/bash可能甚至不存在)如下:

  1. 现代Debian和Ubuntu系统,其中符号连接sh默认为破折号;
  2. Busybox,通常在Linux系统启动时作为initramfs的一部分运行。它使用ash shell实现。
  3. BSD。OpenBSD使用pdksh,Korn的后裔。FreeBSD的sh是原始的后代。

有关此问题的更多信息,请参见:Difference between sh and bash

票数 2
EN

Stack Overflow用户

发布于 2014-01-09 11:47:26

在那里,也许childProcess没有跑到尽头

请尝试:

proc.waitFor()

并在proc.waitFor().之前在其他线程中运行read stdInput和stdError

示例:

代码语言:javascript
复制
public static String execute(String command) {
        String[] commands = new String[] { "/bin/sh", "-c", command };

        ExecutorService executor = Executors.newCachedThreadPool();
        try {
            ProcessBuilder builder = new ProcessBuilder(commands);

            /*-
            Process proc = builder.start();
            CollectOutput collectStdOut = new CollectOutput(
                    proc.getInputStream());
            executor.execute(collectStdOut);

            CollectOutput collectStdErr = new CollectOutput(
                    proc.getErrorStream());
            executor.execute(collectStdErr);
            // */

            // /*-
            // merges standard error and standard output
            builder.redirectErrorStream();
            Process proc = builder.start();
            CollectOutput out = new CollectOutput(proc.getInputStream());
            executor.execute(out);
            // */
            // child proc exit code
            int waitFor = proc.waitFor();

            return out.get();
        } catch (IOException e) {
            return e.getMessage();
        } catch (InterruptedException e) {
            // proc maybe interrupted
            e.printStackTrace();
        }
        return null;
    }

    public static class CollectOutput implements Runnable {
        private final StringBuffer buffer = new StringBuffer();
        private final InputStream inputStream;

        public CollectOutput(InputStream inputStream) {
            super();
            this.inputStream = inputStream;
        }

        /*
         * (non-Javadoc)
         * 
         * @see java.lang.Runnable#run()
         */
        @Override
        public void run() {
            BufferedReader reader = null;
            String line;
            try {
                reader = new BufferedReader(new InputStreamReader(inputStream));
                while ((line = reader.readLine()) != null) {
                    buffer.append(line).append('\n');
                }
            } catch (Exception e) {
                System.err.println(e);
            } finally {
                try {
                    reader.close();
                } catch (IOException e) {
                }
            }

        }

        public String get() {
            return buffer.toString();
        }
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21019172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档