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

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

 本文转载自微信公众号「 小姐姐味道」,作者小姐姐养的狗 。转载本文请联系小姐姐味道公众号。

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

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

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

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

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

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

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

各位使用kill -9的兄弟们,个个都像黑黑的李逵,单纯、暴力、不讲人情。

SIGKILL 

Kill signal 
结束信号 
  • 1.
  • 2.
  • 3.
  • 4.

中国的中庸太极之道,在此荡然无存。kill -9直接使得优雅关闭这个名词成了废物。

何为优雅关闭?其实就像是人的“遗言”,要在死之前,交代一些身后事。

我就常常在想,在我死之前,要把所有的钱花的一分不剩。既不留给后代,也不让它烂在银行里。这就需要做很多事。

计算机软件中,在死之前,要处理的事情也还不少。比如,需要把缓冲区的内容处理完毕,发送出去;微服务节点需要先把自己从注册中心摘除,才能放心的go die。

大体来说,有下面几个影响:

  • 请求丢失:内存队列中等待执行请求丢失
  • 数据丢失:处于内存缓存中数据未持久化到磁盘
  • 文件损坏:正在写的文件没有没有更新完成,导致文件损坏
  • 业务中断:处理一半的业务被强行中断,如支付成功了,却没有更新到数据库中
  • 服务未下线:上游服务依然往停止节点发送请求

这些情况下,如果把服务玩坏了,正好被领导撞上,被开是分分钟的事。

Java应用中处处充斥着这种优雅,靠的是shutdownhook钩子。就是下面这行代码:

Runtime 
    .getRuntime() 
    .addShutdownHook( 
    new Thread(() -> System.out.println("Do something in Shutdown Hook"))); 
  • 1.
  • 2.
  • 3.
  • 4.

有没有好的办法?有,用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 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

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

问题是,通常情况下,你还是需要等待上几秒。自动化机器人不会觉得烦,你会。

所以你还是用kill -9。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

 

责任编辑:武晓燕 来源: 小姐姐味道
相关推荐

2019-02-15 09:50:39

单身程序员脱单

2012-11-28 09:52:45

苹果云地图iCloud

2020-12-17 10:14:01

比特币加密货币区块链

2019-07-23 07:58:17

谷歌Android开发者

2019-02-13 14:04:01

2023-10-26 01:30:00

系统架构成本较高

2021-04-07 11:08:15

Sudo命令Linux

2022-03-23 09:52:41

AI赛车训练

2024-02-20 12:49:00

CSS函数前端

2019-12-06 10:00:58

代码开发Java

2018-03-15 13:31:48

润乾LinuxGREP搜索

2022-04-14 11:17:41

MySQL字符配置

2021-06-18 10:12:09

JS代码前端

2023-09-12 14:58:00

Redis

2010-07-23 10:23:05

Google机房

2020-11-12 09:45:16

前端开发代码

2023-10-12 10:11:19

2022-09-25 23:10:53

Python数据集机器学习

2022-03-09 14:57:53

Numbapython

2021-09-15 08:45:55

Python文本文件代码
点赞
收藏

51CTO技术栈公众号