如何从Windows任务管理器检测Java程序强制关闭?

7

如果我的问题太初级,冒犯了某些人,请原谅,因为我看到有人因为不适当的问题而被“标记下来”。

这是我第一次在这里提问,如果有什么不合适的地方,请原谅,如果我的英语不太好也请见谅。

我想在程序通过任务管理器关闭时创建一个临时文件...但我不知道如何检测我的程序是否是通过任务管理器关闭的!!!

怎么做呢?我在谷歌上搜索了很多,但要么我用了错误的关键词,要么在互联网上没有简单的解决方案。我希望这里有人可以帮助我。

最好的问候和提前致谢。


需要更多信息。操作系统是什么?您想让Java程序创建文件还是其他什么?您为什么要这个文件?您想实现什么目标? - RobertB
亲爱的,我想让Java程序在通过任务管理器关闭之前创建临时文件....我知道如何创建临时文件,但不知道如何捕获是否是通过任务管理器关闭的。 - Ahmad MOUSSA
也许您可以运行其他Java应用程序(使用Runtime.getRuntime().exec() ),这将创建临时文件。在这种情况下,您可以检查进程是否正在运行。 - Vitalii Pro
亲爱的...我想要创建的文件与程序中的数据相关,该程序被任务管理器强制关闭了!!! - Ahmad MOUSSA
1个回答

6
为了捕捉类似于SIGTERM或者WM_CLOSE这样的常规终止请求,可以安装一个Shutdown Hook(关机钩子)(我假设你使用的是Windows系统,但这并不重要)。
然而,当从“进程”选项卡中杀死进程,或在Windows系统上执行taskkill /f ... 或在Linux或Unix上执行kill -9 ...时,进程(虚拟机)将被强制终止,无法做出反应。在Windows上通过“应用程序未响应”对话框杀死进程也是如此。
因此,你需要确保能够处理由于强制终止(除了停电或硬件故障)而导致损坏/不完整文件的情况。
参考链接:

亲爱的@Sam...你说得太对了...我知道你所说的一切...但是我不知道如何在我的Java程序中捕获这个错误!!! - Ahmad MOUSSA
1
不,目前你不能这样做。尽管不同的编程语言提供了不同的信号和退出处理机制,但结果是相同的(当然是在用户空间内)。即使进程在不可中断的系统调用中被锁定一段时间,只要完成了,它就会被终止。你唯一的选择是通过使用事务IO来保持正常执行期间的一致性,但这会带来性能损失。例如,基于文件的数据库系统如sqlite就提供了在提交时额外刷新磁盘缓存(同步)的选项。 - Sam
非常感谢你,@Sam....它帮了我很多...我会将你的答案标记为正确(y) - Ahmad MOUSSA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接