专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
ONE文艺生活  ·  “我四岁,给爸妈买了一套房” ·  昨天  
洞见  ·  对家人,嘴下留情 ·  3 天前  
甘肃省司法厅  ·  夜读|真正有本事的人,往往都有这4个特征 ·  3 天前  
51好读  ›  专栏  ›  吴师兄学算法

“kill -9”一时爽,秋后算账泪两行

吴师兄学算法  · 公众号  ·  · 2020-10-21 10:00

正文

点击上方“ 五分钟学算法 ”,选择“星标”公众号

重磅干货,第一时间送达

kill 是杀死的意思,带有主动的意味。鉴于 master slave 这样的名词,需要在计算机软件中进行整改,kill这样明显带有负面信息的单词,按理说也需要被干掉。

不过,如果把命令名字改了,效果也许会更好。因为在Linux上, kill 根本就不是杀死的意思。

它只是想要给进程发送一个信号而已。使用 kill -l 可以看到长长的信号列表。

对Java程序员来说,用的最多的就是 kill -9 ,我也不知道从哪里来的传承,码农们都喜欢这种暴力性的命令--喜欢用锋利的匕首一击致命。

但是这种玩法又危险的多,不给进程说话的机会。

大家都知道电视剧里,重要人物临死的时候,会啰啰嗦嗦说很多话,话说不完是不会死的。无论是武林高手,还是达官贵人,都得交代一些能让故事情节继续发展下去的废话。

《水浒传》里的“英雄们”,来的就相对直接一些。看的不爽,直接单刀直入切中要害,不允许他人有一丁点的废话,通常情况下直接嗝屁。

各位使用 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






请到「今天看啥」查看全文