如何在Java中正常处理SIGKILL信号

如何在Java中正常处理SIGKILL信号,第1张

如何在Java中正常处理SIGKILL信号

用任何语言的任何程序都不可能处理SIGKILL。这样一来,即使程序有错误或恶意,也总是可以终止程序。但是SIGKILL并不是终止程序的唯一方法。另一种是使用SIGTERM。程序可以处理该信号。程序应通过受控但快速的关机来处理信号。当计算机关闭时,关闭过程的最后阶段将向其余每个进程发送一个SIGTERM,为这些进程提供几秒钟的宽限期,然后向他们发送一个SIGKILL。

除了注册关闭钩子以外,处理此问题的其他方法。如果可以使用(SIGTERM),则关闭挂钩将起作用。(SIGINT)确实会使程序正常退出并运行关闭钩子。kill -9kill -15kill -2

注册一个新的虚拟机关闭挂钩。

Java虚拟机响应以下两种事件而关闭:

  • 当最后一个非守护线程退出时,或者调用exit(等效于System.exit)方法时,程序将正常退出,或者
  • 响应于用户中断(例如键入^ C)或系统范围的事件(例如用户注销或系统关闭)而终止虚拟机。
    我试图在OSX 10.6.3以下测试程序和kill -9它没有不运行关闭挂钩,符合市场预期。在kill -15它DOES运行关机钩每次。
public class TestShutdownHook{    public static void main(String[] args) throws InterruptedException    {        Runtime.getRuntime().addShutdownHook(new Thread()        { @Override public void run() {     System.out.println("Shutdown hook ran!"); }        });        while (true)        { Thread.sleep(1000);        }    }}

没有任何方法可以kill -9在任何程序中真正正常地处理。

在极少数情况下,虚拟机可能会中止,即在不干净关闭的情况下停止运行。当虚拟机在外部终止时会发生这种情况,例如在Unix上使用SIGKILL信号或在Microsoft Windows上使用TerminateProcess调用。

处理a的唯一实际选择kill -9是让另一个观察程序监视您的主程序消失或使用包装脚本。您可以使用外壳程序脚本来执行此 *** 作,该脚本会轮询ps命令以在列表中查找您的程序,并在程序消失时采取相应措施。

#!/usr/bin/env bashjava TestShutdownHookwait# notify your other app that you quitecho "TestShutdownHook quit"


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5431971.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存