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