java程序优雅退出

直接上结论:

  使用 SignalHandler 来拦截 Linux 信号,控制程序优雅退出

场景说明:

  a.杀死一个Linux程序,可以直接使用kill 的方式,例如kill -s TERM pid

NAME
     kill – terminate or signal a process

SYNOPSIS
     kill [-s signal_name] pid ...
     kill -l [exit_status]
     kill -signal_name pid ...
     kill -signal_number pid ...

点击此处看Linux信号机制

  b. 如果想在杀死java进程时可以做一下善后事情

直接上代码

import sun.misc.Signal;
import sun.misc.SignalHandler;

public class Handler implements SignalHandler {

    final private SignalHandler prevHandler;

    public Handler(String signal) {
        this.prevHandler = Signal.handle(new Signal(signal), this);
    }

    /**
     * 自定义处理逻辑
     * @param signal
     */
    @Override
    public void handle(Signal signal) {
        System.out.println("received signal:" + signal.toString());
        // 此处自定义
        prevHandler.handle(signal);
    }

    /**
     * 注册信号处理器
     * @param signal
     */
    public static void register(String ... signal ) {

        for (String signalName : signal) {
            new Handler(signalName);
        }
    }
}

# Spring boot 启动测试
public class MonkeyApplication {

    public static void main(String[] args) {
        Handler.register("TERM", "HUP", "INT");

        SpringApplication.run(MonkeyApplication.class, args);
    }
}

测试验证

# jps 查看进程 pid
jps

23617 Jps
20920 RemoteMavenServer36
20922 RemoteMavenServer36
2574 
23582 Launcher
23583 MonkeyApplication
## 发现我们应用进程id 23583
# 杀死进程,测试是否优雅退出
kill -s TERM 456453

通过打印的日志看到成功拦截来信号
日志中输出打印了我们自定义处理逻辑
received signal:SIGTERM

附上Linux信号相关知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值