如果ShellExecuteEx的调用者死亡,则停止JVM窗口进程

时间:2015-05-04 12:44:11

标签: java windows jna elevated-privileges

我创建了一个java库,它提升了从具有管理员权限的JAR运行的java应用程序。在linux上这很好用,如果我通过在linux中按CTRL-C退出应用程序,升级的应用程序就会按照预期停止sudo停止。在Windows上,这不是行为。当我使用CTRL-C退出时,管理员进程继续运行,我需要从任务管理器手动停止它。

请参阅代码@ https://github.com/rritoch/super-user-application/blob/master/src/main/java/com/vnetpublishing/java/suapp/WinSudo.java

如果调用进程终止,如何通过键入CTRL-C退出用户,如何使用JPA / ShellExecuteEx创建的进程自动终止?

1 个答案:

答案 0 :(得分:0)

作为此问题的临时解决方案,我添加了一个关闭钩子来结束子进程。这不是一个理想的解决方案,因为如果强制退出父进程,则不会运行shutdownHook并且子进程继续运行,但这确实处理了CTRL-C启动的退出。

    final HANDLE childProcess = execInfo.hProcess;

    Thread shutdownHook = new Thread() {
        @Override
        public void run() {
            System.out.println("Terminating child process");
            Kernel32.INSTANCE.TerminateProcess(childProcess, 0);
            Kernel32X.INSTANCE.CloseHandle(childProcess);
            Kernel32X.INSTANCE.CloseHandle(hJob);
        }
    };

    Runtime.getRuntime().addShutdownHook(shutdownHook);