我们的Android应用程序会生成一个logcat shell进程,然后读取其结果进行处理。 但是,当应用程序停止时(例如,在开发期间重新编译后重新启动时),logcat进程将继续运行。以下是此行为的示例:
processes = new ArrayList<Process>();
try {
processes.add(Runtime.getRuntime().exec("logcat -v time"));
processes.add(Runtime.getRuntime().exec("logcat -v time"));
processes.add(Runtime.getRuntime().exec("logcat -v time"));
processes.add(Runtime.getRuntime().exec("logcat -v time"));
} catch (IOException e) {
// oh no!
}
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
for (Process p : processes) {
p.destroy();
}
};
});
将此添加到测试应用的onCreate()方法,启动它,然后使用设置管理器强制停止它。子进程将继续运行,现在父进程为1。
在How to kill logcat process initiated by Android application?中,建议使用ProcessBuilder,但这不是解决方案,而且流程也将继续运行。
在Stop child process when parent process stops中,建议使用关闭钩子 - 如上所示,它不起作用。
谢谢!
答案 0 :(得分:1)
每当它死亡时,也杀死它的所有孩子。
一个脆弱的例子:
int pid = android.os.Process.myPid();
String script = "while [ -d /proc/" + pid + " ];do sleep 1;done; killall logcat";
Process p = Runtime.getRuntime().exec("/system/bin/sh", "-c", script);
这假设您的进程不以root身份运行,因此只会终止其自己的logcat进程。在关机功能中,您应首先终止其他进程(logcat
),然后运行p.destroy();
以停止此杀手级脚本。
通过删除killall
的使用,可以改进上述脚本。相反,请使用反射(this answer指向http://www.golesny.de/p/code/javagetpid)获取logcat
进程的进程ID,并将其传递给kill
。