如何在android上获取失败的shell命令的错误消息

时间:2012-02-02 17:11:22

标签: android shell runtime message

在root设备上,我尝试运行一个读取内核日志的cat命令,如下所示:

Process p = Runtime.getRuntime().exec("su");
p = Runtime.getRuntime().exec("/system/bin/cat /proc/kmsg");

su命令已成功执行但不是cat。 我尝试使用getInputStream()读取命令的输出,但没有任何内容,如下所示:

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
 while ((read = err.read(buffer)) > 0)
 {  //read error to buffer 
catOutput.append(buffer, 0, read);
 }
 in.close();

我使用与ls命令相同的代码而不是显示内核日志,它工作正常并向我显示结果。

我想知道在执行cat命令时我得到了什么错误并希望在shell上看到错误消息。尝试了p.getErrorStream(),但它没有给我任何结果。 任何人都可以帮助我吗?谢谢。

2 个答案:

答案 0 :(得分:0)

以下是关于如何执行此操作的全面示例 - 请注意,我从this回答了这个想法:

public void catKmsg() {
  Runtime runtime = Runtime.getRuntime();
  Process proc = null;
  OutputStreamWriter osw = null;
  StringBuilder sbstdOut = new StringBuilder();
  StringBuilder sbstdErr = new StringBuilder();

  String command="/system/bin/cat /proc/kmsg";

  try { // Run Script

    proc = runtime.exec("su");
    osw = new OutputStreamWriter(proc.getOutputStream());
    osw.write(command);
    osw.flush();
    osw.close();

  } catch (IOException ex) {
    ex.printStackTrace();
  } finally {
    if (osw != null) {
      try {
        osw.close();
      } catch (IOException e) {
        e.printStackTrace();                    
      }
    }
  }
  try {
    if (proc != null) {
      proc.waitFor();
    }
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  sbstdOut.append(ReadBufferedReader(new InputStreamReader
                                     (proc.getInputStream())));
  sbstdErr.append(ReadBufferedReader(new InputStreamReader
                                     (proc.getErrorStream())));
  if (proc.exitValue() != 0) {
  }
}

答案 1 :(得分:0)

我终于通过使用RootTools库找到了解决问题的方法。 最近发布(问我的问题几个月后),RootTools提供了一个易于使用的工具集,可帮助运行需要root权限的命令。在创建shell命令之前,我创建了一个包装器来检查root访问是否可用:

void testRootToolsCommand(String command){

    if (RootTools.isRootAvailable())
        toastMessage("Root is available !!!");
    else { 
        toastMessage("NO ROOT !!! ");
        return; 
    }

    int timeOut = 1000; 
    try {
        List<String> output = RootTools.sendShell(command,timeOut);     
        toastMessage("OUTPUT of the command \n" + output.toString());           
    } catch (RootToolsException re) {
        toastMessage("Funny thing happened with RootTools!!! ");            
    } catch (TimeoutException te)
    {
        toastMessage("Timeout exception - Increase timeout !!! !!! ");
    }
    catch (Exception e) { 
    toastMessage(e.getMessage().toString());
    }       
}

函数调用的一个例子是:

testRootToolsCommand("cat /proc/kmsg > /sdcard/jun11_4h51.txt");

注意:该工具还支持一次运行多个命令。