java 进程撤销_2020-08-12 如何优雅关闭java进程

kill -l可以看到信号列表

439d79fdf920

列表

kill -9 pid 可以直接杀死pid的进程,不过这种方式太暴力了。可能会出现:

请求丢失:内存队列中等待执行请求丢失

数据丢失:处于内存缓存中数据未持久化到磁盘

文件损坏:正在写的文件没有没有更新完成,导致文件损坏

业务中断:处理一半的业务被强行中断,如支付成功了,却没有更新到数据库中

服务未下线:上游服务依然往停止节点发送请求

java中存在着优雅停机,靠的是shutdownhook钩子。例如:

Runtime

.getRuntime()

.addShutdownHook(

new Thread(() -> System.out.println("Do something in Shutdown Hook")));

linux中可使用kill -15 发送SIGTERM信号,

去尝试杀死进程,如果过一段时间,进程还没停止,kill -9有出场机会。kill默认信号值就是15。

常用的信号,还有SIGQUIT,也就是kill -3。

在Java程序下,kill -3的输出特别有意思,它直接在stdout上输出了jstack命令所产生的内容。如果是tomcat,那么输出就在canalina.out文件里。

如果jstack对你的应用不好使了,或者应用几乎没有响应了。使用kill -3是一种曲线救国的方式。

其实是JDK屏蔽了这个信号,对Java来说是一个福利。我们在JDK的文档中找到相关介绍。

Sun’s JVM catches signals to implement shutdown hooks for abnormal JVM termination. The JVM uses SIGHUP, SIGINT, and SIGTERM to initiate the running of shutdown hooks.

The JVM uses a similar mechanism to implement the pre-1.2 feature of dumping thread stacks for debugging purposes. Sun’s JVM uses SIGQUIT to perform thread dumps.

以下脚本可以优雅停机,能够接受两个参数。第一个参数是pid,第二个参数是等待的秒数:

pid=$1

count=$2

n=0

if [ ! -n $count ];then

count=10

fi

while [[ $n  -lt  $count ]]

do

let "n++"

kill -0 $pid

if [ $? -ne 0 ]

then

echo "program not exist"

break

else

echo "send kill -15 to$pid"

kill -15 $pid

sleep 1

fi

if [[ $n  -eq $count ]]

then

echo "kill -9$pid"

# after 10s , try to send kill -9

kill -9 $pid

fi

done

脚本将持续使用kill -0判断进程是否存在,然后持续发送kill -15指令。等超过指定的秒数,进程依然存在,则最终发送kill -9命令。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值