我正在开发一个将作为服务运行的应用程序。我已经为程序添加了一个关闭钩子来进行一些文件清理。当我将程序作为服务安装时(在Linux上作为守护程序或作为Windows服务),关闭挂钩正确执行。但是,在IDE中运行时,永远不会执行关闭挂钩。有没有办法在IDE中停止正在运行的进程并执行shutdown hook?
谢谢, 巴勃罗
答案 0 :(得分:3)
不幸的是,在当前的Netbeans系统中无法做到这一点,因为两种类型的应用程序测试(Debug和Normal)的kill方法都很好地杀死了进程,没有机会进行清理。 根据应用程序的体系结构,您可以添加System.exit(0)调用,但除此之外,您将无法在控制台中打开它。
答案 1 :(得分:2)
我不同意。根据定义,在Windows中使用unix或终止进程的sigkill将 kill 正在运行的进程,而不会让应用程序能够捕获这些事件。这对于终止无响应的过程是必要的。仅当进程不响应siginit(ctrl c)或sigterm或end任务时,才应使用这些信号。 NetBeans似乎发送了一个sigkill而不是siginit或sigterm。就我而言,这是不好的做法。
应该有一个辅助选项来终止进程,但主要进程按钮应该是发送siginit或sigterm。应用程序应该预期用户在其应用程序上点击 ctrl c 或结束任务,并尽最大努力关闭files/sockets
并保存persistent/state
数据。应用程序不应该预期sigkill或终止进程,而是以不需要sigkill或终止进程的方式开发。
NetBeans使用这些方法作为从IDE终止应用程序的唯一方法是错误的。
答案 2 :(得分:0)
不。不要使用shutdown hooks清理程序。来自docs ...
在极少数情况下,虚拟机可能会中止,即停止 在没有干净地关闭的情况下跑步。这发生在虚拟时 机器在外部终止,例如使用SIGKILL信号 在Unix上或Microsoft Windows上的TerminateProcess调用。虚拟 例如,如果本机方法出错,机器也可能会中止 破坏内部数据结构或尝试访问 不存在的记忆。如果虚拟机中止则无法保证 可以判断是否会运行任何关闭挂钩。
当合同声明无法保证始终会调用您的关闭挂钩时,建议不要将它们用于关键操作。