Skip to content

sysmaster的信号处理

sysMaster采用1+1+N架构,sysmaster不再作为1号进程,因此内核为1号进程的信号做的特殊处理不再生效。下表列出了init(1号进程)、sysmaster、systemd的信号处理方式以及sysMaster与systemd针对不同信号的响应逻辑差异。

信号 init sysmaster systemd sysmaster与systemd对外表现是否有差异
1) SIGHUP 捕获不处理 daemon-reload daemon-reload N
2) SIGINT 捕获不处理 start ctrl-alt-del.target start ctrl-alt-del.target N
3) SIGQUIT 捕获不处理 故障恢复 crash handler Y
4) SIGILL 捕获不处理 故障恢复 crash handler Y
5) SIGTRAP 捕获不处理 IGN DFL N
6) SIGABRT 捕获不处理 1号进程下发重执行/故障恢复 crash handler Y
7) SIGBUS 捕获不处理 故障恢复 crash handler Y
8) SIGFPE 捕获不处理 故障恢复 crash handler Y
9) SIGKILL 内核主动屏蔽该信号 DFL 内核主动屏蔽该信号 Y
10) SIGUSR1 捕获不处理 IGN 重连dbus Y
11) SIGSEGV 捕获不处理 故障恢复 crash handler Y
12) SIGUSR2 捕获不处理 IGN 输出所有单元的配置信息 Y
13) SIGPIPE 捕获不处理 IGN IGN N
14) SIGALRM 捕获不处理 IGN DFL N
15) SIGTERM 捕获不处理 daemon-reexec daemon-reexec N
16) SIGSTKFLT 捕获不处理 IGN DFL N
17) SIGCHLD 僵尸子进程回收 僵尸子进程回收 僵尸子进程回收 N
18) SIGCONT 捕获不处理 IGN DFL N
19) SIGSTOP 内核主动屏蔽该信号 DFL 内核主动屏蔽该信号 Y
20) SIGTSTP 捕获不处理 IGN DFL N
21) SIGTTIN 捕获不处理 IGN DFL N
22) SIGTTOU 捕获不处理 IGN DFL N
23) SIGURG 捕获不处理 IGN DFL N
24) SIGXCPU 捕获不处理 IGN DFL N
25) SIGXFSZ 捕获不处理 IGN DFL N
26) SIGVTALRM 捕获不处理 IGN DFL N
27) SIGPROF 捕获不处理 IGN DFL N
28) SIGWINCH 捕获不处理 IGN start kbrequest.target Y
29) SIGIO 捕获不处理 IGN DFL N
30) SIGPWR 捕获不处理 IGN start sigpwr.target Y
31) SIGSYS 捕获不处理 故障恢复 DFL N
34) SIGRTMIN 捕获不处理 IGN start default.target Y
35) SIGRTMIN+1 捕获不处理 IGN isolate rescue.target Y
36) SIGRTMIN+2 捕获不处理 IGN isolate emergency.target Y
37) SIGRTMIN+3 捕获不处理 IGN start halt.target Y
38) SIGRTMIN+4 捕获不处理 IGN start poweroff.target Y
39) SIGRTMIN+5 捕获不处理 IGN start reboot.target Y
40) SIGRTMIN+6 捕获不处理 IGN start kexec.target Y
41) SIGRTMIN+7 捕获不处理 IGN DFL N
42) SIGRTMIN+8 unrecover state IGN DFL N
43) SIGRTMIN+9 重执行sysmaster IGN DFL N
44) SIGRTMIN+10 switch root IGN DFL Y
45) SIGRTMIN+11 捕获不处理 IGN DFL N
46) SIGRTMIN+12 捕获不处理 IGN DFL N
47) SIGRTMIN+13 捕获不处理 IGN Immediate halt Y
48) SIGRTMIN+14 捕获不处理 IGN Immediate poweroff Y
49) SIGRTMIN+15 捕获不处理 IGN Immediate reboot Y
50) SIGRTMAX-14 SIGRTMIN+16 捕获不处理 IGN Immediate kexec Y
51) SIGRTMAX-13 SIGRTMIN+17 捕获不处理 IGN DFL N
52) SIGRTMAX-12 SIGRTMIN+18 捕获不处理 IGN DFL N
53) SIGRTMAX-11 SIGRTMIN+19 捕获不处理 IGN DFL N
54) SIGRTMAX-10 SIGRTMIN+20 捕获不处理 IGN enable status messages Y
55) SIGRTMAX-9 SIGRTMIN+21 捕获不处理 IGN disable status messages Y
56) SIGRTMAX-8 SIGRTMIN+22 捕获不处理 IGN 日志级别设为debug Y
57) SIGRTMAX-7 SIGRTMIN+23 捕获不处理 IGN 日志级别设为info Y
58) SIGRTMAX-6 SIGRTMIN+24 捕获不处理 IGN Immediate exit (仅限于用户模式) Y
59) SIGRTMAX-5 SIGRTMIN+25 捕获不处理 IGN reexecute manager Y
60) SIGRTMAX-4 SIGRTMIN+26 捕获不处理 IGN 日志输出设为journal-or-kmsg Y
61) SIGRTMAX-3 SIGRTMIN+27 捕获不处理 IGN 日志输出设为console Y
62) SIGRTMAX-2 SIGRTMIN+28 捕获不处理 IGN 日志输出设为kmsg Y
63) SIGRTMAX-1 SIGRTMIN+29 捕获不处理 IGN 日志输出设为syslog-or-kmsg Y
64) SIGRTMAX SIGRTMIN+30 捕获不处理 IGN DFL N

表格的具体说明:

  1. IGN、DFL分别表示信号处理函数:SIG_IGN(忽略)、SIG_DFL(缺省的信号处理函数)。如果1号进程没有注册信号处理函数,即使用SIG_DFL,内核会直接屏蔽掉该信号。因此1号进程在对外表现上,SIG_IGN和SIG_DFL是一致的。
  2. SIGKILL、SIGSTOP信号是内核为1号进程无条件屏蔽的,且不允许通过sigaction修改其信号处理函数,sysmaster当前没有方案消除该差异。
  3. init进程:
    • SIGCHLD: 回收所有僵尸子进程。
    • SIGRTMIN+8: 进入不可恢复状态。
    • SIGRTMIN+9: 下发SIGABRT信号重执行sysmaster。
    • SIGRTMIN+10: 只处理sysmaster进程的SIGRTMIN+10信号,其余进程忽略。重执行init自身,重执行sysmaster。
    • init捕获所有可捕获信号,除上述信号做了处理以外,其余都忽略不处理。
  4. sysmaster进程:
    • SIGCHLD: 回收所有僵尸子进程。
    • SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGSYS: 当存在switch.debug配置文件时,执行故障恢复。
    • SIGABRT:当存在switch.debug配置文件时,用于init重执行sysmaster或执行故障恢复。
    • SIGUSR1、SIGUSR2、SIGWINCH、SIGPWR、SIGRTMIN+{0-6、13-16、20-29}sysmaster与systemd的差异后续能够消除。

Last update: June 16, 2023
Created: May 6, 2023