如何在Android上销毁golang子进程?
最近,我用如何在Android上销毁golang子进程?,android,go,subprocess,kill-process,Android,Go,Subprocess,Kill Process,最近,我用Runtime.getRuntime().exec(command)尝试Android子进程,发现我可以销毁NodeJS http服务器,但无法销毁Go http服务器 对于节点和go二进制文件,可从Termux获得 节点http服务器: 转到http服务器: 对于节点子进程,它可以在安卓服务和p.waitFor()中启动;当时间到了,它可以被p.destroy()杀死 但是,对于go子进程,它可以启动,但不能被p.destroy()甚至p.destroy()杀死。强制销毁();在
Runtime.getRuntime().exec(command)
尝试Android子进程,发现我可以销毁NodeJS http服务器,但无法销毁Go http服务器
对于节点
和go
二进制文件,可从Termux获得
- 节点http服务器:
- 转到http服务器:
服务和p.waitFor()中启动;当时间到了,它可以被p.destroy()杀死
但是,对于go子进程,它可以启动,但不能被p.destroy()
甚至p.destroy()杀死。强制销毁()
;在本文中,它确保了go服务器可以正常关闭,我尝试了它,但p.destroy()
仍然无法工作
如果有人能告诉我一个终止这个过程的方法,我将不胜感激。谢谢 刚刚想出了一个破解方法;不优雅;如果有更好的解决方案,请指导我
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-opid=--ppid=
获取子树并杀死所有进程以进行清理;不优雅;如果有更好的解决方案,请指导我
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-opid=--ppid=
获取子目录树并杀死所有进程以进行清理