Linux无内建命令直接统计进程接收信号总次数,但可通过strace跟踪信号收发、/proc/PID/status查看待处理信号、perf观测signal_deliver事件或eBPF程序精准计数来间接实现。

Linux 中没有内建命令直接统计某个进程“接收信号的总次数”,但可以通过多种方式间接监控和估算信号接收行为,核心思路是:跟踪信号发送动作、捕获进程实际响应、或利用内核观测工具实时观测信号传递过程。
使用 strace 实时跟踪单个进程的信号收发
这是最常用且直观的方法,适合调试或短期监控:
-
strace -e trace=signal -p PID:只跟踪目标进程(PID)的信号相关系统调用,如
kill()、sigreturn()、rt_sigprocmask()等;当进程收到信号并进入信号处理函数时,会打印类似--- SIGUSR1 {si_signo=SIGUSR1, si_code=SI_USER, si_pid=1234, si_uid=1000} ---的日志 - 若需统计次数,可配合
grep和wc -l:
strace -e trace=signal -p 1234 2>&1 | grep '^--- SIG' | wc -l - 注意:strace 会暂停被跟踪进程(因 ptrace 机制),不适合生产环境长期运行;且仅能看到被交付并触发处理的信号,忽略被阻塞、忽略或未抵达用户态的信号
通过 /proc/PID/status 查看信号待处理状态
该文件提供当前进程信号队列的快照,反映“已发送但尚未处理”的信号数量(即 pending 信号):
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 查看字段:
SigQ:显示格式为 queued/limit,例如SigQ: 2/8192表示当前有 2 个信号在队列中等待投递 - 这个值是瞬时值,不能累计历史总数;但可周期性采样(如用
watch -n 1 'grep SigQ /proc/1234/status')观察是否有信号持续积压,间接判断信号是否频繁到达或处理不及时 - 结合
SigPnd(pending for current thread)、ShdPnd(shared pending)、SigBlk(blocked mask)等字段,可分析信号阻塞与投递逻辑
使用 perf 统计内核级信号事件(需 root 权限)
perf 可以观测内核中 signal_deliver 等 tracepoint,实现轻量级、低干扰的信号交付计数:
- 启用信号交付追踪:
perf record -e 'syscalls:sys_enter_kill,syscalls:sys_enter_tkill,syscalls:sys_enter_tgkill,tracepoint:signal:signal_generate,tracepoint:signal:signal_deliver' -p PID - 分析时重点关注
signal_deliver事件——每次进程真正从内核态向用户态交付一个信号时触发,可较准确反映“成功送达用户处理”的次数 - 导出后用
perf script查看或用perf report聚合统计;支持按信号编号分组:
perf script | awk '/signal_deliver/ {print $NF}' | sort | uniq -c - 优势:不影响进程执行流,比 strace 更适合短时生产环境观测;缺点是需要内核开启 tracepoint 支持(CONFIG_TRACEPOINTS=y,默认开启)
编写简单 eBPF 程序精准计数(高级方案)
若需长期、细粒度、进程级信号接收计数(含忽略/阻塞/处理),可借助 eBPF:
- 挂载在
tracepoint:signal:signal_deliver上,提取sig字段和pid,用 per-process map 累加计数 - 配合
bpftrace快速验证:
bpftrace -e 'tracepoint:signal:signal_deliver { @[comm, args->sig] = count(); }' —— 输出各进程名+信号编号的接收频次 - 需安装 bpftrace 或 libbpf 工具链;适合定制化监控平台集成,不推荐临时排查

















