作者:微信小助手
发布时间:2020-05-16T09:19:06
脚本之家 你与百万开发者在一起 作者 l Hollis 来源 l Hollis(ID:hollischuang) 相信很多程序员对于Linux系统都不陌生,即使自己的日常开发机器不是Linux,那么线上服务器也大部分都是的,所以,掌握常用的Linux命令也是程序员必备的技能。 但是,怕就怕很多人对于部分命令只是一知半解,使用不当就能导致线上故障。 前段时间,我们的线上应用报警,频繁FGC,需要紧急处理问题,于是有同事去线上重启机器(正常程序应该是先采集堆dump,然后再重启,方便排查是否存在内存泄露等问题)。 但是在重启过程中,同事发现正常的重启命令应用无反应,然后尝试使用kill命令"杀"掉Java进程,但是仍然无效。于是他私自决定使用 "kill -9"结束了进程的生命。 虽然应用进程被干掉了,但是随之而来带来了很多问题,首先是上游系统突然发生大量报警,对应开发找过来说调用我们的RPC服务无响应,频繁超时。 后来,我们又发现系统中存在部分脏数据,有些在同一个事务中需要完整更新的数据,只更新了一半… 为什么正常的kill无法"杀掉"进程,而kill -9就可以?为什么kill -9会引发这一连串连锁反应?正常的kill执行时,JVM会如何处理的呢? 要搞清楚这些问题,我们要先从kill命令说起。 PART 01 kill 命令 我们都知道,想要在Linux中终止一个进程有两种方式,如果是前台进程可以使用Ctrl+C键进行终止;如果是后台进程,那么需要使用kill命令来终止。(其实Ctrl+C也是kill命令) kill命令的格式是: kill的命令参数有以下几种: -l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称 -a 当处理当前进程时,不限制命令名和进程号的对应关系 -p 指定kill 命令只打印相关进程的进程号,而不发送任何信号 -s 指定发送信号 -u 指定用户 通常情况下,我们使用的-l(信号)的时候比较多,如我们前文提到的kill -9中的9就是信号。 信号如果没有指定的话,默认会发出终止信号(15)。常用的信号如下: HUP 1 终端断线 INT 2 中断(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 终止 KILL 9 强制终止 CONT 18 继续(与STOP相反, fg/bg命令) STOP 19 暂停(同 Ctrl + Z) 比较常用的就是强制终止信号:9和终止信号:15,另外,中断信号:2其实就是我们前文提到的Ctrl + C结束前台进程。 那么,kill -9 和 kill -15到底有什么区别呢?该如何选择呢? PART
如:
kill 21121
kill -9 21121