1 回答
TA贡献1841条经验 获得超3个赞
刚刚想出了一个破解方法;不优雅;如果有的话,请指导我找到更好的解决方案!
Log.d("AppDebug", p.javaClass.getName())
// from above log
// we can know Android use "java.lang.UNIXProcess" as implementation of java.lang.Process
// to make sure the sub process is killed eventually
if (p.isAlive()) {
val klass = p.javaClass
if (klass.getName().equals("java.lang.UNIXProcess")) {
Log.d("AppDebug", "force terminate sub process ..")
try {
val f = klass.getDeclaredField("pid");
f.setAccessible(true);
val pid = f.getInt(p);
// XXX: buggy here, if getInt throw an error, the filed is exposed!
f.setAccessible(false);
android.os.Process.killProcess(pid);
Log.d("AppDebug", "force terminating done.")
} catch (e: Exception) {
Log.d("AppDebug", "force terminating failed.")
}
} else {
Log.d("AppDebug", "force terminating not supported.")
}
}
对不起我的误导。ps -ef目前我完全理解为什么在我添加一些关于杀死进程之前/之后的日志之后我的 go 服务器不能被杀死。
实际上我go run main.go用来启动服务器;但是,go run main.go将编译代码并在 tmp 文件夹中生成二进制文件;然后它将产生一个子进程(执行二进制文件);当我这样做时p.destroy(),它只是杀死了该go进程,但子服务器进程仍然存在。
正确的解决方案是,pid像上面的代码一样;并用于ps -o pid= --ppid=<pid>获取子树并杀死所有进程以进行清理。
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报