搜索
写经验 领红包

kill-9杀哪个进程(kill-9杀不掉进程)

导语:你还在使用kill -9 杀进程吗?从原理谈避免踩雷!

kill -9 杀哪个进程(kill-9杀不掉进程)

你要“跑路”了吗?

只要你用过 UNIX/LINUX ,我敢打赌你大概率执行过这样一条命令,也就是俗话说的“杀进程”:

kill -9

执行它,是不是如同执行以下命令一样酸爽:

rm -rf

因为他带来了一种感觉和预期,那就是:别拦我,我要跑路了!

同样是杀进程, kill -9 有什么特别之处 ?

Perl 大牛 Randal Schwartz 这样描述过:

no no no,不要使用kill -9。

它没有给进程留下善后的机会:

1) 关闭 socket 连接

2) 清理临时文件

3) 将自己将要被销毁的消息通知给子进程

4) 重置终止状态

如果你是用了 kill -9,就意味着用收割机来修剪花盆里的花,换句话说,就是杀鸡用了牛刀。进程没有机会完成清理工作,会留下一些不完整的文件和状态。下次系统重启时会带来很多麻烦。

先了解一下原理

有什么可以替代 kill -9 呢?我们先来了解一下相关的原理。

先看下图。

重点说下 9)SIGKILL 和 15)SIGTERM。

也就是说执行 kill -9 时,系统会发 SIGKILL 信号给进程,而在执行 kill -15 命令时,系统会发 SIGTERM 的信号给进程。

收到 SIGKILL 的信号,进程立即终止,该信号不能被捕获或忽略,并不执行任何清理文件步骤。非常残酷和决绝。收到 SIGTERM 的信号,会导致进程的终止,但是不同于SIGKILL,它可以被捕获和解释(或忽略)。 有点像:温柔的问一句进程,终止你可好?这样可以清理文件并关闭。

事实上,正常关机的时候,大部分系统都会发SIGTERM给所有不是一定要断电的进程,等待几秒,然后发出SIGKILL强行终止仍旧存在的进程。

在你想kill -9之前,其实还能做点其他的!

当你输入 kill 的时候,默认情况下发送的就是 -15,发送的 SIGTERM 信号,以便为目标进程提供自我清理的机会。

如果进程被卡住,比较好的一些方法是可以使用 strace、truss、ltrace 或 gdb来查看进程为什么被卡住,此外 pstack 也可以协助排查。

在 kill -9 痛下杀手之前,一般情况下,你可以发送15(SIGTERM),查看状态; 等待一小会儿,如果不起作用,发送2(SIGINT);如果还不起作用,发送1(SIGHUP);如果不成功,删除二进制文件,因为程序不是在正常运行。

什么时候应该用 kill -9 呢?

当然很多人会说,我常使用 kill -9,并没有感觉到有什么不妥,这样做的真的是省事又方便。

但是常在河边走,哪有不湿鞋。当你破坏了一个重要数据库或造成其他损失的时候,会后悔只图一时痛快。

因此 kill -9 是不得已而为之的最后的手段,尽量不要用在生产系统上,特别是像 mount 这样的进程上,除非你再也不想用那个你想杀掉的进程关联的程序、数据库、磁盘、文件......

你会经常用 kill -9 吗?在评论区留下你的意见吧。

后续还会分享运维小技巧,欢迎关注。

本文内容由小婷整理编辑!