Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android上销毁golang子进程?_Android_Go_Subprocess_Kill Process - Fatal编程技术网

如何在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=
获取子目录树并杀死所有进程以进行清理