在Linux中运行终端命令并在java程序中获取输出的代码如下:
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 /这样的普通命令,并返回适当的结果。但我的目标是运行以下命令:
echo 23 > /sys/class/gpio/export例如,用于激活CubieBoard平台中的gpio引脚。(Cubieboard是一款小型pc板,类似于Raspberry Pi)。
现在,在系统本身的终端中运行这个命令,工作正常,并给出适当的结果。但是,当我从这个java代码运行它时,我无法得到任何结果。
关键是,它工作正常,命令执行得很好,但我无法获得命令的输出消息!
例如,如果引脚是从过去活动的,那么通常它应该返回结果如下:
bash: echo: write error: Device or resource busy但是,当我通过上面的java代码运行这个命令时,我不会得到任何响应。(它再次生效,但仅仅是终端的响应,我无法得到!)
当我运行代码时,代码中的stdInput和stdError变量都有值null。:(
请帮助我,以便我能完成我的项目。这是唯一剩下的部分:(
谢谢。
发布于 2014-03-10 15:42:23
代码是对的,就在第二行,我更改了
"/bin/sh" to "/bin/bash"一切都正常!
sh == bash?
很长一段时间以来,/bin/sh常常指向大多数GNU/Linux系统上的/bin/bash。因此,忽略两者之间的差异几乎变得安全了。但这种情况最近开始改变。
一些流行的/bin/sh不指向/bin/bash的系统示例(其中一些/bin/bash可能甚至不存在)如下:
有关此问题的更多信息,请参见:Difference between sh and bash
发布于 2014-01-09 11:47:26
在那里,也许childProcess没有跑到尽头
请尝试:
proc.waitFor()
并在proc.waitFor().之前在其他线程中运行read stdInput和stdError
示例:
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();
}
}https://stackoverflow.com/questions/21019172
复制相似问题