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