阅读斯蒂芬的优秀回复之一,
当。。。的时候操作系统
SIGTERM
关闭,使用和关闭进程SIGKILL
,但这些信号不是来自内核(或者不是直接来自调用kill()
pid 为 0 或负 pid 将导致内核向多个进程发送信号)。他们来自服务管理器终止其服务和来自各种最后一搏杀死一切的应用程序模式程序,它们是系统管理机制的一部分: 例如killprocs
范·斯穆伦伯格rc
剧本, 这killprocs
OpenRC 脚本,以及systemd-shutdown
程序。
当操作系统关闭时,
服务管理器如何知道它应该终止其服务?服务管理器是否通过从内核或某个进程接收 SIGKILL 或 SIGTERM 或其他信号来通知?
同样,作为系统管理机制一部分的各种最后一搏杀死一切的应用程序模式程序如何知道它们应该发出 SIGTERM 和 SIGKILL?
谢谢。
答案1
服务管理器知道它应该终止其服务,因为系统管理员要求它停止或重新启动系统。当管理员运行reboot
,或者用户在他/她的桌面环境中选择相应的选项时,进程init
会被告知重新启动(此时不是内核)。在要求内核实际重新启动之前,该init
进程会处理其配置要做的所有事情。
最后一搏,杀死一切阶段是关闭过程的一部分:一旦关闭过程要求所有正在运行的服务停止,它通常会等待一小会儿,然后杀死所有剩余的进程。
不同的 init 系统对此有不同的实现。使用 时sysvinit
,停止或重新启动是一种运行级别转换,首先要求运行init
切换到适当的运行级别(请参阅联机telinit
帮助页了解详情)。对于 systemd,它是一个最终运行的目标服务systemd-halt
。