3

我正在开发一个需要以 root 用户身份运行命令的应用程序,所以我使用:

process = Runtime.getRuntime().exec("su");

然后我启动 te 进程:

os = new DataOutputStream(process.getOutputStream());

os.writeBytes("tcpdump\n");

当我需要完成的过程os.writeBytes("exit\n");不起作用并且process.waitFor();被阻止并且过程没有完成时。我需要将 Control-C 发送到进程以停止它,但我不知道该怎么做。

谢谢。

4

3 回答 3

1

在他的github 上,Chainfire 提供了一个类的示例实现Shell,您可以使用它以 root 身份执行命令。该类处理所有使用的任务,Threads因此您可以确保该命令即使没有返回也不会阻塞。

代码片段:

if(Shell.SU.available()){
   Shell.SU.run("commandAsRoot"); //Command executed as root
else{
   System.out.println("su not found");

或者,如果您确定su二进制文件可用,您可以运行您的命令(注释行)并跳过检查。

来源:如何苏

于 2013-01-20T21:14:48.807 回答
1

找出 API 在某处是否有 kill() 方法,并使用该方法将 SIGINT 信号发送到目标进程。

于 2011-02-22T14:14:45.080 回答
0

将此添加到您希望发出 ctrl-c 信号的位置。

Process interrupt = Runtime.getRuntime().exec("su");
ios = new DataOutputStream(interrupt.getOutputStream());

ios.writeBytes("pkill -SIGINT tcpdump");
ios.flush();
ios.close();
interrupt.waitFor();

如果有多个以 tcpdump 的名字运行的进程,需要有选择性,使用 pidof 和 grep 命令找出具体的进程 id。如果它对您有用,请接受答案。如果您遇到问题,请在评论中告诉我。

于 2014-08-18T07:13:50.020 回答