kill -l 是最直接、最可靠的方式,能列出当前系统实际支持的全部信号编号与名称,不依赖文档或头文件,输出即运行时真实可用的信号集合。

kill -l 是最直接、最可靠的方式,能列出当前系统实际支持的全部信号编号与名称。它不依赖文档或头文件,输出即运行时真实可用的信号集合。
用 kill -l 查所有信号(含编号和名称)
在任意终端中执行:
kill -l
你会看到类似输出(共 64 个信号,但中间有空缺):
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 ... 34) SIGRTMIN 35) SIGRTMIN+1 ... 64) SIGRTMAX
- 编号 1–31 是传统(非实时)信号,不排队,多次发送可能丢失
- 编号 34–64 是实时信号,支持排队,按顺序递送,适合高可靠场景
- 注意:没有 32、33 号信号 —— 它们被内核保留,
kill -l不显示 - 输出中省略了
SIG前缀,但使用时可带可不带(kill -TERM和kill -SIGTERM等价)
用 kill -l 反查单个信号编号或名称
当你只知道名称想确认编号,或只知道编号想确认名称,kill -l 支持双向查询:
-
kill -l TERM→ 输出15 -
kill -l 1→ 输出HUP - 大小写不敏感:
kill -l sigkill也返回9 - 前缀可省:
kill -l usr1和kill -l SIGUSR1都返回10
这个特性在写脚本时特别有用,比如需要动态构造信号参数,避免硬编码数字。
为什么不用 /usr/include/.../signal.h 查信号?
有人会去翻 /usr/include/asm-generic/signal.h 或 bits/signum.h,但这条路容易踩坑:
- 头文件反映的是编译时内核 ABI 的定义,不是当前运行系统的实际能力
- 不同架构(x86_64 vs aarch64)或不同内核版本,
SIGRTMIN起始值可能不同(常见为 34,但非绝对) - 某些发行版头文件路径不统一,
find /usr/include -name signal.h可能返回多个结果,难以判断哪个生效 -
kill -l是 shell 内置命令(或/bin/kill),调用的是当前系统的sys_siglist,结果唯一可信
过滤和脚本化使用的小技巧
日常排查或自动化时,常需快速定位某类信号:
- 只看实时信号:
kill -l | grep RT - 排除默认忽略的信号(如
SIGCHLD):kill -l | grep -v CHLD - 导出为数组供 shell 脚本用:
signals=($(kill -l)),之后${signals[0]}是1),需注意格式含括号 - 真正安全的脚本用法是结合
kill -l NAME &>/dev/null判断信号是否存在,而非解析输出
别依赖输出格式稳定 —— 不同版本 kill 对齐方式可能变,解析编号+名称映射时优先用反查模式(kill -l NAME),更健壮。











