我在新分配的项目中发现了一堆脚本,即"关闭"脚本.他们只是做一些基本搜索并运行Unix kill
命令.他们有什么理由不应该这样关闭这个过程吗?这是否确保动态分配的内存将正确返回?还有其他负面影响吗?我在直觉下操作,这是终止进程的最后手段.
该kill
命令向Unix进程发送信号.该信号默认为SIGTERM,这是程序退出的礼貌请求.
当进程因任何原因退出时,Unix OS 会清理其内存分配,文件句柄和其他资源.唯一没有被清理的资源是那些应该被共享的资源,比如文件和共享内存的内容(如System V IPC).
许多程序在退出时不需要进行任何特殊清理,并使用默认的SIGTERM行为,即让操作系统停止进程.
如果程序确实需要特殊行为,它可以安装信号处理程序,然后它可以运行一个函数来处理信号.
现在,SIGKILL信号(数字9)是邪恶的,但也是必要的.这个信号永远不会进入过程本身,操作系统简单地停止了该过程.这应该只在真正,非常必要的时候使用.在多线程程序中经常需要进入死锁或安装了TERM信号处理程序的程序,但在退出过程中搞砸了.
kill是对该计划结束的礼貌要求.它清理它的内存,关闭它的句柄和其他这样的好处.它发送一个SIGTERM
kill -9告诉操作系统通过球抓住进程然后把它扔出吧.显而易见,它并不关心好处 - 尽管它确实回收了所有内存,因为操作系统负责跟踪它.但是因为它是一个强制关闭,你可能在尝试再次运行程序时遇到问题(例如,不清理.pid文件)
另见[维基百科](http://en.wikipedia.org/wiki/Kill_ ( Unix)
每个进程都在自己的受保护地址空间中运行,当进程结束时(无论是自愿退出还是被外部信号杀死),地址空间都被完全回收.所以是的,如果它的内存被正确释放的话.
根据过程的不同,下次尝试运行时可能会或可能不会导致其他问题.例如,它可能会打开一些文件,如果它意外被杀,则会使它们处于不一致状态.(文件将自动关闭,但它可能正在编写某些应用程序数据,例如,如果被中断,文件可能包含不完整/不一致的数据.)
通常,当系统关闭时,所有进程都将发送信号15(SIGTERM),在该信号下,它们可以执行他们需要执行的任何清理/关闭操作.然后不久之后,他们会得到信号9(SIGKILL),这会立即杀死他们,而不给他们任何机会做出任何反应.这使得所有进程都有机会自行清理,然后强制杀死任何没有及时响应的进程.