我正在尝试使用超级用户(su)以下列方式定期运行shell命令:
首先我得到了su进程:
Process p = Runtime.getRuntime().exec("su");
然后,定期我跑:
p.getOutputStream().write("some shell command".getBytes());
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = r.readLine()) != null) //Process output line
这个问题是r.readLine()阻塞而且永远不会返回。只有当我创建一个新的su进程并在读取输出之前添加p.getOutputStream()。close()时代码才会成功。
有没有办法使用单个su进程发出shell命令?
答案 0 :(得分:1)
FWIW,我刚刚遇到同样的问题,似乎我通过检查BufferedReader上的r.ready()
来解决它。如果没有更多行要从进程输出中读取,则r.ready()
返回false。我不知道在不同版本的操作系统中它有多可靠,但它适用于2.3。
编辑:同样,在开始读取输出之前,请确保稍微休眠一下(例如,200ms),以便命令的所有输出都进入缓冲区。
答案 1 :(得分:0)
您必须使用ProcessBuilder定义流程 尝试:
Process p = new ProcessBuilder()
.command("su")
.redirectErrorStream(true)
.start();
BufferedReader inputReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while (inputReader.ready() && (line = inputReader.readLine()) != null)
{
System.out.println(line);
}
如果您对区分out和err流不感兴趣,请使用redirectErrorStream(true)合并两个流。这简化了您的阅读代码,并且更容易避免阻止目标进程。 Link