Linux kill、kill-15、kill-9区别
进程状态转换图
kill和kill -9,两个命令在linux中都有杀死进程的效果,然而两命令的执行过程却大有不同,在程序中如果用错了,可能会造成莫名其妙的现象。
执行kill(不加 -* 默认kill -15)命令,系统会发送一个SIGTERM信号给对应的程序。当程序接收到该signal信号后,将会发生以下事情:
程序立刻停止
当程序释放相应资源后再停止
程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后再停止。但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应,我在使用wkhtmltopdf转pdf的项目中遇到这现象),也就是说,SIGTERM多半是会被阻塞的。
然而kill -9命令,系统给对应程序发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。
小结:在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。
Perl语言专家Randal Schwartz在一篇短文里这样写:
no no no.不要使用kill -9.
它没有给进程留下善后的机会:
1) 关闭socket链接
2) 清理临时文件
3) 将自己将要被销毁的消息通知给子进程
4) 重置自己的终止状态
等等。
通常,应该发送15,等一两秒钟,如果没效果,发送2,如果还不行,发送1。如果还不行,那你应该把那个程序删掉,因为那个程序写的太烂了!
不要使用kill -9。不要用收割机来修剪花盆里的花。
总之,在使用kill -9前,你应该先使用kill -15,给目标进程一个清理善后工作的机会。(进程也许无法捕捉或直接忽略SIGKILL信号,但它们可以,通常也是能够捕捉SIGTERM信号的。)如果你不留机会让进程完成清理工作,它们会留下一些不完整的文件或状态,当系统重启时,程序将无法理解这些状态。
strace/truss,ltrace和gdb都是查看一个卡住的进程因何卡住的好工具。(Solaris里的truss -u非常好用;)Solaris里还有一些非常有用的/proc相关的工具,有一些已经被移植到了Linux上。
最新文章
- web在线打印,打印阅览,打印维护,打印设计
- win64位安装python-mysqldb1.2.5
- SAD算法在opencv上的实现代码(c++)
- 织梦CMS的MVC体系
- Unix/Linux编程实践教程(二:socket、多线程、进程间通信)
- C#EasyHook例子C# Hook 指定进程C#注入指定进程 z
- AngularJS(11)-API
- <;摘录>;PS和TS流的区别
- Single linked List by pointer
- 【Java一看就懂】浅克隆和深克隆
- Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程
- Gulp(自动化构建工具 )
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.1 A map with single layer
- Python - mouse clicks and keystrokes on a background window
- 8.css内容移出与精灵图
- 007 jquery过滤选择器-----------(屬性过滤选择器)
- jquery ajax和php实现返回值 json类型
- Django之Form
- 007-Hadoop Hive sql语法详解2-修改表结构
- 环境变量 - Maven