1. 结束进程的方式一般会用 kill -9 pid的方式
给进程发-9信号会造成进程强制退出,有一些未flush的文件描述符,没有机会flush,会造成数据不准确,或者磁盘文件数据不完成或损坏的情况。
推荐使用 kill -2 pid结束进程,-2信号在没有注册处理函数的情况下,会执行默认处理退出进程,但是会执行进程的钩子函数,在钩子函数里做清理工作,把未flush的数据存到磁盘,socket未发出的数据发出去。
2. 实验
创建一个简单的springboot程序
HiController继承DisposableBean,继承这个类会在钩子函数回调里面的方法。
@RestController
@Slf4j
public class HiController implements DisposableBean {
@GetMapping("/hi")
public String hi(){
log.info("hi");
return "hi";
}
@Override
public void destroy() throws Exception {
log.info("程序结束回调,用于结束时关闭资源");
}
}
打包启动
java -jar simple-app.jar
3. kill -9 结束进程
并没有回调钩子函数
4. kill -2 结束进程
执行了钩子回调,把该处理的事情处理完毕,内存数据未flush的flush到磁盘