处理外部杀死进程的情况

6

我正在编写一个程序,在进程中创建多个线程。

如果进程被其他人使用kill -9信号或Ctrl + C杀死,我需要处理,使我的程序在关闭之前执行某些操作,例如将进程状态更改为数据库中的“已中止”。

我该如何处理?

我需要使用addShutdownHook()吗?还是有其他更好的解决方案?

我已经添加了:

Runtime.getRuntime().addShutdownHook( new Thread() {

            @Override
            public void run() {
                logger.info( "Running Shutdown Hook" );
                //call some method
                System.out.println( "Running Shutdown Hook" );
            }
        } );

我在主方法中这样写,但是好像不起作用。

2个回答

2
简短回答:可能不起作用。
请参阅JavaDoc中的addShutdownHook()
在罕见情况下,虚拟机可能会中止,即在没有干净关闭的情况下停止运行。这种情况发生在虚拟机在外部终止时,例如在Unix上使用SIGKILL信号或在Microsoft Windows上使用TerminateProcess调用时......如果虚拟机中止,则不能保证是否会运行任何关机钩子。
换句话说:关机钩子不是解决您需求的可靠选择。

1
Shutdown hook可以用于Kill -15甚至Ctrl-C。请注意不要随意使用kill -9,只要正确使用,它应该能正常工作。 - caburse

0

你把它放在了实例化的地方吗?尝试运行下面的代码并停止它。

 import java.util.concurrent.TimeUnit;

 public class KillTest {

    public static void main(String args[]) {
       Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                call some method
                System.out.println("Running Shutdown Hook");
            }
        });

        try{
            TimeUnit.MINUTES.sleep(10);
        }catch(Exception e){
            System.out.println("Error thrown");
        }finally {
            System.out.println("How awesome is finally?");
        }
    }
}

2
我有点不明白你的回答。当进程收到 SHUTDOWN 信号时,睡眠的意义是什么?此外……我认为我的回答很好地表明了关闭钩子对于“kill”信号不起作用。因此,在原始代码中添加一些尝试/捕获和睡眠根本没有帮助。 - GhostCat
@caburse 是的,我已经尝试过了,但它没有打印任何东西 :( - chumak
1
@chumak 我知道什么不起作用...并不意味着我知道什么会起作用。如果我知道的话,我早就告诉你了;-( ...我猜你还需要做更多的研究。最坏的情况是,整个方法行不通;你必须想办法改变你的需求。 - GhostCat
1
刚刚重新阅读了您的要求。它可以使用Ctrl C或干净的关闭kill -15工作,但不能使用kill -9。 - caburse
更好的交流在这里。https://dev59.com/QnE85IYBdhLWcg3w8IM4 - caburse
显示剩余6条评论

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