当前位置: 首页 > 面试题库 >

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

江瀚昂
2023-03-14
问题内容

当程序收到终止信号时,如何处理清理?

例如,有一个我连接的应用程序希望任何第三方应用程序(我的应用程序)finish在注销时发送命令。finish当我的应用被a破坏时,发送该命令的最好的说法是kill -9什么?

编辑1:不能杀死-9。谢谢你们纠正我。

编辑2:我想这种情况将是当那只叫杀死与ctrl-c相同


问题答案:

用任何语言的任何程序都不可能处理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 bash

java TestShutdownHook
wait
# notify your other app that you quit
echo "TestShutdownHook quit"


 类似资料:
  • 问题内容: 我需要在接收到任何终止命令(如SIGTERM和SIGKILL)时写入日志文件。 我可以注册SIGTERM,但是如何处理SIGKILL信号? 问题答案: 您不能,至少不是因为进程被杀死。 您 可以 做的是安排父进程监视子进程的死亡,并采取相应的措施。任何体面的过程监控系统(例如daemontools)都内置了这样的工具。

  • 让我们假设我们有这样一个用java编写的普通守护进程: 我们使用 来守护它,默认情况下,它会在 上发送 (TERM) 信号 假设当前执行的步骤是#2,此时我们正在发送项信号。 发生的情况是执行立即终止。 我发现我可以使用<code>addShutdownHook()</code>处理信号事件,但问题是它仍然会中断当前的执行,并将控制传递给处理程序: 所以,我的问题是——有没有可能不中断当前的执行,

  • 问题内容: 我希望我的计时器一次执行一次actionPerformed方法(5秒一次),但是它多次在控制台“ Hello”中写入: 如何产生想要的效果?谢谢 问题答案: 如前所述,最好使用,但也可以在开始之前使用setRepeats():

  • 我目前正在尝试为spring boot实现一个自定义的错误处理程序,我已经用以下方法实现了它: 不知为什么这不起作用,并且异常仍然被抛给客户端,是否有某种方法捕获方法抛出的异常并忽略它。

  • 异常处理就是这样工作的吗?

  • 问题内容: 如何用Java 处理? 问题答案: 我不确定“句柄”是什么意思。 您当然可以捕获该错误: 但这很可能是个坏主意,除非您确切地知道自己在做什么。