直接上结论:
使用 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 ...
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