进程状态转换图

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上。

最新文章

  1. web在线打印,打印阅览,打印维护,打印设计
  2. win64位安装python-mysqldb1.2.5
  3. SAD算法在opencv上的实现代码(c++)
  4. 织梦CMS的MVC体系
  5. Unix/Linux编程实践教程(二:socket、多线程、进程间通信)
  6. C#EasyHook例子C# Hook 指定进程C#注入指定进程 z
  7. AngularJS(11)-API
  8. <摘录>PS和TS流的区别
  9. Single linked List by pointer
  10. 【Java一看就懂】浅克隆和深克隆
  11. Android Multimedia框架总结(十九)Camera2框架C/S模型之CameraService启动及与Client连接过程
  12. Gulp(自动化构建工具 )
  13. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.1 A map with single layer
  14. Python - mouse clicks and keystrokes on a background window
  15. 8.css内容移出与精灵图
  16. 007 jquery过滤选择器-----------(屬性过滤选择器)
  17. jquery ajax和php实现返回值 json类型
  18. Django之Form
  19. 007-Hadoop Hive sql语法详解2-修改表结构
  20. 环境变量 - Maven

热门文章

  1. Java自学-接口与继承 多态
  2. xcode11新项目删除main.storyboard 两种方法
  3. spark任务分配----TaskSchedulerImpl源码解析
  4. java开发中,一些小的JS应用
  5. vue+element-ui上传图片时压缩大小
  6. CSS 用法和特性
  7. java版ftp简易客户端(可以获取文件的名称及文件大小)
  8. OSPF 多区域配置
  9. Dart 知识点:位置参数(必选)、位置参数(可选)、命名参数(都是可选)
  10. C++输入输出流 cin/cout 及格式化输出简介