ps命令可查看进程信号注册状态,如sigcatch(捕获)、sigign(忽略),而/proc/pid/status提供sigpnd(挂起)、sigblk(阻塞)、sigcgt(捕获)等十六进制位图,strace -e signal则实时观察信号是否真正递达。

用 ps 查看进程当前信号处理状态
ps 能直接显示进程对哪些信号设置了忽略、捕获或默认处理,但只反映当前注册的 handler 状态,不体现是否被屏蔽或挂起。
- 运行
ps -p <pid> -o pid,comm,sig,sigcatch,sigign</pid>:其中sig是被阻塞(blocked)的信号位图(十六进制),sigcatch列出已注册 handler 的信号(如2,10,12),sigign列出明确忽略的信号(如17,19) - 注意:
sig字段是阻塞掩码,不是 pending 信号;它和/proc/<pid>/status</pid>中的SigBlk对应,但格式不同(ps用十进制位图,/proc用十六进制) - 如果某信号既不在
sigcatch也不在sigign,说明走默认动作(比如SIGTERM默认终止)
用 /proc/<pid>/status</pid> 查信号位图细节
内核最权威的信号状态来源,能区分 pending / blocked / caught 三类状态,但需手动解析位图。
- 执行
cat /proc/<pid>/status | grep -E "SigPnd|SigBlk|SigCgt"</pid> -
SigPnd:挂起(pending)信号位图,表示已发送但尚未递达(比如被阻塞中) -
SigBlk:当前被屏蔽(blocked)的信号位图,对应sigprocmask()设置 -
SigCgt:已注册 handler 的信号位图(即signal()或sigaction()设置过) - 所有字段都是 64 位十六进制数(如
0000000000000000),低位对应信号 1(SIGHUP),高位对应信号 64;普通信号只用低 32 位
用 strace -e signal 实时观察信号递达行为
这是唯一能确认「信号是否真被进程收到并处理」的方法,适用于调试 handler 是否生效、是否被屏蔽拦截。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 运行
strace -p <pid> -e trace=signal</pid>,进程一收到信号就会打印类似--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=12345, si_uid=1000} --- - 若全程无输出,说明信号根本没递达——可能是被屏蔽(
SigBlk中该位为 1),也可能是发错 PID 或权限不足 - 加
-f可跟踪子进程;用strace -e signal=SIGUSR1只过滤特定信号 - 注意:
strace本身会干扰信号传递路径(比如某些信号会被 strace 截获),仅用于诊断,勿用于生产环境长期挂载
用 kill -l 和 man 7 signal 查信号编号与默认动作
很多问题源于搞错信号编号或误判默认行为,必须交叉验证。
-
kill -l输出信号名与编号映射,但注意:SIGUSR1是 10(非 1),SIGRTMIN起才是实时信号(34+) -
man 7 signal明确列出每个信号的默认动作(Term、Ign、Core、Stop等),比如SIGCHLD默认Ign,SIGPIPE默认Term - 不要依赖记忆:
SIGHUP编号是 1,但某些旧系统可能重定义;始终以kill -l输出为准 - 若自定义 handler 后行为异常,先查手册确认该信号是否允许忽略(如
SIGKILL和SIGSTOP不可捕获也不可忽略)
信号状态分散在多个地方,ps 看注册、/proc/<pid>/status</pid> 看位图、strace 看实际递达——缺一不可。最容易被忽略的是 SigPnd 和 SigBlk 的关系:一个信号在 SigPnd 中出现,同时也在 SigBlk 中置位,就说明它卡住了,永远无法触发 handler。










