本文转载自微信公众号《小姐姐的味道》,作者小姐姐养的狗。转载本文请联系味觉小姐公众号。kill是杀死的意思,有主动的意思。鉴于master、slave等名词在计算机软件中需要整顿,kill等明显带有负面信息的词也需要被kill掉。但是,如果更改命令名称,效果可能会更好。因为在Linux上,kill根本不是杀人的意思。它只是想向进程发送信号。使用kill-l查看一长串信号。对于Java程序员来说,用的最多的就是kill-9。不知从何而来的传承。coder们喜欢这种用锋利的匕首进行暴力命令式的杀戮。但是这种打法危险多了,而且不给进程说话的机会。大家都知道,在电视剧里,当一个重要的人快要死的时候,他会说很多话,说不完就不会死。不管是武林高手,还是达官贵人,都要解释一些废话,才能让剧情继续发展。《水浒传》中的“英雄”来得比较直接。不好看,开门见山,不许别人有半点废话,平时直接打嗝。使用kill-9的兄弟们,一个个都像黑李逵一样,纯洁、狂暴、冷酷。SIGKILL9KillsignalEndSignal中国的中庸太极之道到此为止。kill-9直接让gracefulshutdown这个词没用了。什么是优雅的闭包?其实它就像一个人的“遗言”,死前必须交代。我经常想,我会在死之前花光所有的钱。既不留给子孙后代,也不让它烂在岸边。这有很多事情要做。在计算机软件中,死前还有很多事情要处理。比如缓冲区的内容需要处理后发送出去;微服务节点需要先将自己从注册中心移除,然后才能放心地死去。一般来说有以下几种影响:请求丢失:内存队列中等待执行的请求丢失数据丢失:内存缓存中的数据没有持久化到磁盘文件损坏:正在写入的文件没有更新,导致文件损坏,业务中断:处理一半业务被强行中断,比如支付成功,但是没有更新到数据库,服务没有下线:上游服务仍然向stop节点发送请求。在这些情况下,如果服务坏了,它恰好被领导者击中了。被解雇是分分钟的事。这种优雅在Java应用程序中无处不在,依赖于shutdownhook钩子。就是下面这行代码:Runtime.getRuntime().addShutdownHook(newThread(()->System.out.println("DosomethinginShutdownHook")));有什么好办法吗?是的,只需使用kill-15发送SIGTERM信号即可。但有时kill-15并不能杀死进程。这个时候需要kill-9出现。够了15死废话,用9杀吧。一般需要使用kill-15来尝试杀掉进程。如果过了一段时间(比如10秒),进程还没有停止,就会出现kill-9。kill默认的signal值是15,可以说是非常贴心了。但是还是有很多人在用9,原因想了半天,就一个字:懒。kill-15需要多次确认,而kill-9只做一次,大多数情况下不会有任何反应。如果有什么可以提高工作效率,为什么不去做呢?常用的信号有SIGQUIT,也就是kill-3。在Java程序下,kill-3的输出特别有意思,它直接把jstack命令生成的内容输出到stdout上。如果是tomcat,则输出在canalina.out文件中。如果jstack不适用于您的应用程序,或者应用程序几乎没有响应。使用kill-3是一种拯救国家的弯曲方式。事实上,JDK屏蔽了这个信号,这对Java来说是一个好处。我们在JDK文档中找到了相关的介绍。Sun的JVM捕获信号以实现异常JVM终止的关闭挂钩。JVM使用SIGHUP、SIGINT和SIGTERM启动关闭挂钩的运行。JVM使用类似的机制来实现转储线程堆栈以进行调试的pre-1.2功能。Sun的JVM使用SIGQUIT来执行线程转储。我这里有一个接受两个参数的脚本。第一个参数是pid,第二个参数是等待的秒数。pid=$1count=$2n=0if[!-n$count];thencount=10fiwhile[[$n-lt$count]]dolet"n++"kill-0$pidif[$?-ne0]thenecho"programnotexist"breakelseecho"sendkill-15to$pid"kill-15$pidsleep1fiif[[$n-eq$count]]thenecho"kill-9$pid"#10s后,trytosendkill-9kill-9$pidfidone脚本会继续使用kill-0判断进程是否存在,然后继续发送kill-15命令。在指定的秒数过去后,进程仍然存在,最后发送kill-9命令。问题是,通常,您仍然需要等待几秒钟。自动化机器人不会感到无聊,你会。所以你还是用kill-9。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。我的个人微信xjjdog0,欢迎加好友进一步交流。
