原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。任何不保留此声明的转载都是抄袭。java
kill
是杀死的意思,带有主动的意味。鉴于master
、slave
这样的名词,须要在计算机软件中进行整改,kill这样明显带有负面信息的单词,按理说也须要被干掉。程序员
不过,若是把命令名字改了,效果也许会更好。由于在Linux上,kill
根本就不是杀死的意思。数据库
它只是想要给进程发送一个信号而已。使用kill -l
能够看到长长的信号列表。缓存
对Java程序员来讲,用的最多的就是kill -9
,我也不知道从哪里来的传承,码农们都喜欢这种暴力性的命令--喜欢用锋利的匕首一击致命。tomcat
可是这种玩法又危险的多,不给进程说话的机会。bash
你们都知道电视剧里,重要人物临死的时候,会啰啰嗦嗦说不少话,话说不完是不会死的。不管是武林高手,仍是达官贵人,都得交代一些能让故事情节继续发展下去的废话。微信
《水浒传》里的“英雄们”,来的就相对直接一些。看的不爽,直接单刀直入切中要害,不容许他人有一丁点的废话,一般状况下直接嗝屁。架构
各位使用kill -9
的兄弟们,个个都像黑黑的李逵,单纯、暴力、不讲人情。并发
SIGKILL
9
Kill signal
结束信号
复制代码
中国的中庸太极之道,在此荡然无存。kill -9
直接使得优雅关闭
这个名词成了废物。微服务
何为优雅关闭?其实就像是人的“遗言”,要在死以前,交代一些身后事。
我就经常在想,在我死以前,要把全部的钱花的一分不剩。既不留给后代,也不让它烂在银行里。这就须要作不少事。
计算机软件中,在死以前,要处理的事情也还很多。好比,须要把缓冲区的内容处理完毕,发送出去;微服务节点须要先把本身从注册中心摘除,才能放心的go die
。
大致来讲,有下面几个影响:
这些状况下,若是把服务玩坏了,正好被领导撞上,被开是分分钟的事。
Java应用中到处充斥着这种优雅
,靠的是shutdownhook
钩子。就是下面这行代码:
Runtime
.getRuntime()
.addShutdownHook(
new Thread(() -> System.out.println("Do something in Shutdown Hook")));
复制代码
有没有好的办法?有,用kill -15
发送SIGTERM
信号便可。
但有时候kill -15
并不能杀死进程,这个时候,才是kill -9
须要出场的时候。
听够了15临死前说的一些废话,使用9要它的命。
通常的,须要使用kill -15
去尝试杀死进程。若是过一段时间(好比10秒),进程尚未中止,kill -9
才会出场。
kill的默认信号值,就是15
,能够说是很贴心了。但仍是有不少人使用9
。
我想了半天缘由,就是一个字:懒。
kill -15
须要屡次确认,而kill -9
一次完事,多数状况下不会出事。有这提升工做效率的事,何乐而不为呢?
经常使用的信号,还有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
命令。
问题是,一般状况下,你仍是须要等待上几秒。自动化机器人不会以为烦,你会。
因此你仍是用kill -9
。
做者简介:小姐姐味道 (xjjdog),一个不容许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不同的味道。个人我的微信xjjdog0,欢迎添加好友,进一步交流。