java钩子函数的使用已经kill

package com.aircoder.test;

import java.util.Date;

public class Test {


public static void sysLog(String str){


System.out.println(new Date()+"\t "+str);


}
public static void main(String[] args) {

System.out.println("\t\fHello world ");
sysLog("\t start service .....");

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

public void run(){
System.out.println("是结束了");
}
});

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

public void run(){
System.out.println("是结束了2");
}
});

//System.exit(1); kill 会执行,挨个执行钩子函数, kill -3 会打印线程堆栈,线程不会结束,kill -9 不会执行
while(true){

}
}

}
### 比较 `kill -9` 和 `kill -15` 在 Linux 系统中,`kill -9` 和 `kill -15` 是用于终止进程的两种不同方式,二者之间存在显著的区别。 #### 信号机制 -9 <PID>` 发送 SIGKILL 信号给目标进程时,操作系统会立即无条件地中止该进程。此过程不会给予程序任何机会来处理资源释放或保存状态,相当于直接切断电源的操作[^3]。 - **SIGTERM (Signal Number: 15)** 使用 `kill -15 <PID>` 向指定进程发送的是 SIGTERM 信号,默认情况下大多数守护进程和服务都会监听这种类型的结束请求并作出适当反应。接收到 SIGTERM 后的应用有机会做最后的数据刷新、日志记录以及清理工作之后才优雅地退出。 #### 安全性和稳定性影响 由于上述特性: - 对于某些特定环境下的 Java 应用或者其他依赖复杂上下文管理的服务来说,采用 `kill -9` 可能会造成未完成的任务丢失或者是数据库连接异常等问题;而利用 `kill -15` 则有助于减少这些问题的发生概率,因为它允许 JVM 执行必要的关闭钩子函数以确保所有异步任务都能顺利完成后再行退出。 - 如果一个 Python 进程被挂起(例如通过 Ctrl+Z),它可能处于僵尸状态(defunct),此时即使尝试使用 `kill -9` 来强行终止也可能失败,因为这类进程已经不再活跃并且只保留了一个条目在进程表内等待父进程读取其退出码[^2]。 ```bash # 正确的做法应该是先查找并确认要终止的目标进程ID(PID),然后优先考虑使用 kill -15 尝试平滑停止. ps aux | grep "target_process" kill -15 <PID> sleep 5 # 给予一定时间让进程自行关闭 kill -9 <PID> # 若有必要可作为最终手段使用 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值