【问题标题】:Handle if a process killed externally处理进程是否在外部终止
【发布时间】:2017-05-09 06:10:23
【问题描述】:

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

如果进程被某人使用 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" );
            }
        } );

在我的main方法里面,但是好像不行。

【问题讨论】:

    标签: java multithreading kill-process shutdown-hook sigkill


    【解决方案1】:

    简短回答:可能行不通。

    查看addShutdownHook()的JavaDoc:

    在极少数情况下,虚拟机可能会中止,也就是说,在没有完全关闭的情况下停止运行。当虚拟机从外部终止时会发生这种情况,例如 Unix 上的 SIGKILL 信号或 Microsoft Windows 上的 TerminateProcess 调用...如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。

    换句话说:关闭钩子不是满足您的要求的可靠选择。

    【讨论】:

    • 关机钩子可用于Kill -15甚至Ctrl-C。记下不要鲁莽使用 kill -9 ,只要使用得当,应该可以按预期工作。
    【解决方案2】:

    你有没有把它放在一个可以实例化的地方?尝试运行以下命令并杀死它

     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?");
            }
        }
    }
    

    【讨论】:

    • 当然,如果它在后台运行,你需要添加一个记录器
    • 我有点不明白你的答案。当进程收到 SHUTDOWN 信号时,sleeping 的意义何在?此外......我认为我的回答很好地表明关闭挂钩不适用于“杀死”信号。因此,在原始代码中添加一些带有睡眠的 try/catch 根本没有帮助。
    • @caburse 是的,我已经尝试过了,但它没有打印任何东西:(
    • @chumak 我知道什么是行不通的事实……并不意味着我知道什么行得通。如果我知道,我早就告诉过你了 ;-( ...我想你需要做更多的研究。最坏的情况是,整个方法都行不通;你必须找到一种方法来改变 以某种方式满足您的要求。
    • 重新阅读您的要求。它适用于 Ctrl C 或完全关闭 kill -15 但不适用于 kill -9。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2023-04-11
    相关资源
    最近更新 更多