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

标签: dev | 发表时间:2020-07-01 00:00 | 作者:
出处:http://itindex.net/relian

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。任何不保留此声明的转载都是抄袭。

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

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

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

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

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

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

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

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

  SIGKILL   
9
Kill signal
结束信号

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

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

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

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

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

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

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

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

  Runtime   
.getRuntime()
.addShutdownHook(
newThread(() -> 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,欢迎添加好友,进一步交流。

相关 [kill] 推荐:

no no no. 不要使用kill -9

- - 外刊IT评论网
Perl语言专家Randal Schwartz在一篇短文里这样写:. no no no.不要使用kill -9.. 它没有给进程留下善后的机会:. 1) 关闭socket链接. 3) 将自己将要被销毁的消息通知给子进程. 4) 重置自己的终止状态. 通常,应该发送 15,等一两秒钟,如果没效果,发送 2,如果还不行,发送 1.

端口查看,关闭进程,Kill

- - ITeye博客
1、Windows平台. 在windows命令行窗口下执行:. 1.查看所有的端口占用情况.   协议    本地地址                     外部地址               状态                   PID. 2.查看指定端口的占用情况.   协议    本地地址                     外部地址               状态                   PID.

如何kill一条TCP连接?

- - 掘金 后端
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 如果你的程序写得有毛病,打开了很多TCP连接,但一直没有关闭,即常见的连接泄露场景,你可能想要在排查问题的过程中,先临时kill一波泄露的连接. 又比如你要验证程序在遇到网络错误时的自愈能力,想手动kill掉一些正常TCP连接,看程序是否能自动重连并恢复运行.

每周一款小游戏:创意杀人房间(Creative Kill Chamber)

- Don - 宅映像
一款考验你观察力和反应力的小游戏,利用各种道具和场景要素,来猎杀所有守卫,逃出囚牢. 游戏只需鼠标点击操作,点击特定的道具或场景就能触发动作. 操作很简单,不过想要过关却并不容易,强烈推荐. 为了更好的游戏体验,请点击这里全屏游戏. 由于游戏颇有一些难度(有些细节很难发现),所以这里再给大家提供一份攻略.

Linux中Kill进程的N种方法(转)

- - The Big Data Way,平凡但不乏味
long long ago,曾有一个想法,就是完全脱离windows,使用linux生活、工作. 以前迫于各种专业工具不支持linux,只能无奈的使用xp. 最近工作内 容是android移植+单片机开发,android就不说了,必须用linux开发. 单片机也找到一些linux的工具,于是乎有不少时间是在 linux上进行开发工作.

内存不足时Android 系统如何Kill进程

- - 移动开发 - ITeye博客
大家其实都或多或少知道,Android系统有自已的任务管理器,当系统内存不足时,系统需要KILL一些进程(应用),以回收一部分资源,来保证系统仍可以正常的运行,而不会崩溃,今天,就具体讲讲这个原理. 进程优先级(importance hierarchy). Android系统尽量保持进程运行的更久,但是仍有时候,需要结束掉老的进程,回收内存来保证新的,或更重要的进程运行.

三大应用性能隐形杀手:谁Kill了你的App?

- - IT耳朵
对于移动开发者来讲,活跃用户流失=应用慢性死亡. 当你的创意、用户体验和coding都无懈可击时,是谁在不知不觉中Kill了你的App. 听云平台根据真实数据统计:“连接超时”、 “崩溃”和“CPU使用问题”正是Kill掉你的应用的三大隐形杀手. 根据听云平台统计,网络错误是App关闭的首要问题,而在移动应用中网络错误数据比例报错中最高的就是连接超时错误.

mysql中kill掉所有锁表的进程

- - 学习笔记
很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:. mysql中kill掉所有锁表的进程. 3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂掉了. 出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在mysql的shell里面执行..

redis进程OOM被linux内核kill问题调查 - 简书

- -
运维人员收到zabbix告警说codis集群usa-9节点所在机器,原swap 4G 空间只剩下80k. 其立即登录该机器增加了约6G的swap空间. 接着收到某个应用的500错误告警,错误堆栈里提到codis该usa-9节点 “JedisConnectionException: Unexpected end of stream”,再次登录usa-9拿到 linux的系统日志如下:.

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

- - IT瘾-dev
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 任何不保留此声明的转载都是抄袭. kill是杀死的意思,带有主动的意味. 鉴于 master、 slave这样的名词,需要在计算机软件中进行整改,kill这样明显带有负面信息的单词,按理说也需要被干掉. 不过,如果把命令名字改了,效果也许会更好.