除了最暴力的kill -9(SIGKILL),我不太明白其他 3 个常见信号(此处)-HUP(1)、-INT(2)和-TERM(15)之间的区别。
在哪些情况下,一种有效而另一种无效?
一般什么时候-9( -KILL) 失败?
对我来说,他们似乎要求进程优雅地终止,而不保存. 评价严酷程度,我会放-HUP < -TERM < -INT < -KILL。
Gil*_*il' 76
SIGKILL 永远不会杀死正在运行的进程,这就是重点。存在其他信号以让应用程序有机会做出反应。
SIGINT、SIGTERM、SIGQUIT 和 SIGHUP 的默认行为是终止程序。但是,允许应用程序为这些信号安装处理程序。因此,当应用程序接收到这些信号时,应用程序的实际行为是一个约定问题(每个应用程序可能遵循也可能不遵循),而不是系统设计。
SIGINT 是该批次中“最弱的”。它的传统含义是“立即停止您正在做的事情并等待进一步的用户输入”。它是终端中由Ctrl+生成的信号C。非交互式程序通常将其视为 SIGTERM。
SIGTERM 是“正常”终止信号。它告诉应用程序干净地退出。应用程序可能需要时间来保存它的状态,释放资源,如否则会留在后面的临时文件等。不想在关键应用程序期间被中断的应用程序可能会暂时忽略 SIGTERM。
SIGHUP 在严酷性方面与 SIGTERM 大致相同,但它具有特定的作用,因为当用户与终端断开连接时,它会自动发送到在终端中运行的应用程序(从词源上讲,因为用户是通过电话线和调制解调器连接的挂了)。SIGHUP 通常是非自愿的,不像 SIGTERM 必须显式发送,所以应用程序应该尝试在 SIGHUP 上保存它们的状态。SIGHUP 对于非面向用户的应用程序(守护进程)也有完全不同的常规含义,即重新加载它们的配置文件。
SIGQUIT 是最可忽略的信号。它旨在在应用程序行为不端并且现在需要被终止时使用,并且默认情况下它传统上会留下一个核心转储文件(大多数用户不知道核心文件是什么的现代系统在默认情况下往往不会生成它们) . 应用程序可以设置处理程序,但应该做的很少(特别是不保存任何状态),因为 SIGQUIT 的目的是在出现严重错误时使用。