是否必须将 SIGKILL(和 SIGTERM)显式发送到指定进程?

是否必须将 SIGKILL(和 SIGTERM)显式发送到指定进程?

阅读吉尔斯的回答,

SIGHUP 在严厉程度方面与 SIGTERM 大致相同,但它具有特定的作用,因为当用户与终端断开连接时,它会自动发送到终端中运行的应用程序(从词源上讲,因为用户是通过电话线和调制解调器连接的)挂了)。 SIGHUP 通常是非自愿的,与必须显式发送的 SIGTERM,因此应用程序应尝试在 SIGHUP 上保存其状态。

“必须显式发送的 SIGTERM”中的“显式”是否意味着 SIGTERM 必须最初由进程(而不是内核)通过进程调用发送kill()

我想知道 SIGKILL 是否必须显式发送到指定的进程?内核可以隐式向进程发送 SIGKILL 和 SIGTERM 中的任何一个吗?

当操作系统关闭时,内核是否会向正在运行的进程发送一些信号来终止它们?它是什么信号?内核是否隐式发送它?

谢谢。

答案1

据我所知,Linux 内核不会SIGTERM自行发送给用户进程。 (SIGTERM在内核线程内部使用:这就是内核要求内核线程停止的方式。)

在许多情况下,内核确实会SIGKILL自行向用户进程发送消息。例如,OOM 杀手SIGKILL用;杀死目标一些内核错误结果是SIGKILL;各种内存故障都可能导致SIGKILLs。

当。。。的时候操作系统SIGTERM关闭,使用和关闭进程SIGKILL,但这些信号不是来自内核(或者不是直接来自调用kill()pid 为 0 或负 pid 将导致内核向多个进程发送信号)。它们来自终止其服务的服务管理器以及作为系统管理机制一部分的各种最后一搏杀死一切的应用程序模式程序:例如killprocs范·斯穆伦伯格rc剧本, 这killprocsOpenRC 脚本,以及systemd-shutdown程序

当。。。的时候核心关闭或重新启动,它不关心进程,也不会杀死它们(请参阅reboot()了解详情;忽略LINUX_REBOOT_CMD_RESTART2系统调用的变体,您不能使用命令参数来处理进程)。

相关内容