如何让关机钩子在从 Eclipse 启动的进程上执行

2022-08-31 17:41:11

我的应用程序中有一个关机钩子(使用 创建)。但是,如果我从 Eclipse 中启动应用程序,当它关闭时,关闭钩子不会执行。Runtime.getRuntime().addShutdownHook

我认为这是因为Eclipse向进程发送了相当于强制终止信号的信号,这不会导致关闭钩子执行(相当于Windows上的taskkill /F或Linux上的kill -p),尽管我不确定。

有谁知道如何解决这个问题?我运行的是Windows(Vista),我有一种感觉,这可能是一个特定于Windows的问题,但我不确定。


答案 1

我在主要方法结束时使用以下技巧来解决问题:

if (Boolean.parseBoolean(System.getenv("RUNNING_IN_ECLIPSE"))) {
    System.out.println("You're using Eclipse; click in this console and " +
            "press ENTER to call System.exit() and run the shutdown routine.");
    try {
        System.in.read();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.exit(0);
}  

答案 2

首先,您的应用程序是结束还是强制结束?如果您要强制结束它(通过停止按钮),此 Eclipse 错误报告包含有关为什么这可能不起作用的详细信息。

如果做不到这一点,您可能认为这是特定于Windows的行为。我使用的是 Mac,因此无法确认,抱歉。但是,我可以告诉您,以下测试程序确实按预期执行关闭钩子。

public class MyShutdownHook
{
    public static void main( String[] args )
    {
        System.out.println( "Entering main." );

        Runtime.getRuntime().addShutdownHook( 
            new Thread(
                new Runnable() {
                    public void run() {
                        System.out.println( "Shutdown hook ran." );
                    }   
                }
            )
        );

        System.out.println( "Exiting main." );
    }
}

Javadocs for Runtime#addShutdownHook 确实提到,当 JVM 中止时,关闭钩子不会运行,不会正常退出,所以再次,你的假设可能是正确的。话虽如此,这里有一些事情可以尝试。再说一遍,很抱歉,我不能提前确认这些 - 这里没有Windows。(真福!

  • 确保 JVM 不包含 -Xrs 选项。这对关机挂钩有副作用
  • 尝试使用 -server 或 -client 选项启动 JVM。根据我的经验,边缘情况行为可以通过选择 VM 模式来影响。(特别是在线程方面 - 至少在Mac上。
  • 你是否在探查器或类似工具下启动应用?正在加载任何本机库?
  • 您是否遇到一些致命错误并丢失了它?例如,OutOfMemoryError或类似?
  • 尝试选中/取消选中 Eclipse 中应用程序的“运行配置”对话框中的“在后台启动”选项。
  • 最后但并非最不重要的一点是:如果有机会,请手动调用System.exit()。:)

推荐