【问题标题】:Stop JVM windows process if caller of ShellExecuteEx dies如果 ShellExecuteEx 的调用者死亡,则停止 JVM Windows 进程
【发布时间】:2015-05-04 12:44:10
【问题描述】:

我创建了一个 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

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

【问题讨论】:

  • 将进程句柄添加到使用JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE 配置的job object
  • eryksun,我按照您的建议添加了一个作业对象,但它仍然不起作用。从我的研究中可以看出,ShellExecuteEx 可能没有设置 CREATE_BREAKAWAY_FROM_JOB 并且我看不到任何选项可以这样做。我已根据您的建议提交了代码,但它仍然无法正常工作。
  • 你不是在检查错误,那么你怎么知道它是否被成功添加和配置?您应该首先调用QueryInformationJobObject 来获取并修改当前的JobObjectExtendedLimitInformation (9)。确保它是扩展信息;您当前正在设置JobObjectBasicLimitInformation (2)。
  • eryksun,我添加了全面的错误检查,添加了 QueryInformationJobObject 调用,并按照您的建议更改为 JobObjectExtendedLimitInformation (9),即使每个函数调用成功,子(管理员)进程仍然没有终止父(用户)进程终止。
  • eryksun,我认为应该可以序列化当前进程句柄并将其作为命令行参数传递给子进程并让父进程反序列化它并运行间隔以退出父进程进程关闭,但我也找不到序列化/反序列化 GetCurrentProcess() 返回的进程句柄的方法

标签: java windows jna elevated-privileges


【解决方案1】:

作为此问题的临时解决方案,我添加了一个关闭挂钩来结束子进程。这不是一个理想的解决方案,因为如果父进程被强制退出,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);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多