最可靠方式是运行 kill -l 查看当前系统实际支持的信号;它输出内核与C库真实支持的信号集合,而非文档假设值,编号1–31为传统信号,34–64为实时信号,0、32、33号不存在。

直接运行 kill -l 就能列出当前系统支持的所有信号代号和名称,这是最可靠、最通用的方式。
用 kill -l 查看全部信号编号与名称
这个命令由 shell 内置或 kill 二进制程序提供,输出的是当前内核和 C 库实际支持的信号集合,不是文档假设值。
- 不带参数执行:
kill -l—— 输出所有信号,按编号升序排列,格式如1) SIGHUP - 带信号名反查编号:
kill -l TERM返回15,kill -l sigkill返回9(大小写不敏感,SIG前缀可省) - 带编号反查名称:
kill -l 1返回HUP,kill -l 15返回TERM - 注意:输出中没有 0、32、33 号信号;1–31 是传统信号,34–64 是实时信号(
SIGRTMIN到SIGRTMAX)
为什么不能只信文档或头文件?
不同发行版、容器环境、musl vs glibc、精简内核可能裁剪部分信号支持。例如某些嵌入式镜像里 SIGPWR 或 SIGSTKFLT 可能未定义。
-
/usr/include/asm-generic/signal.h或bits/signum.h是编译时头文件,不代表运行时可用 - 用
man 7 signal看到的是标准语义说明,但不反映当前系统是否真的实现了该信号 - 真正能验证“是否被内核识别”的方式是调用
sigaction()并检查返回值,但日常运维没必要走这步
过滤和定位常用信号的实用技巧
终端里快速找信号,别靠肉眼扫 64 行:
- 查终止类信号:
kill -l | grep -E "(TERM|KILL|QUIT|INT)" - 查控制类信号:
kill -l | grep -E "(STOP|CONT|HUP|USR)" - 只看传统信号(1–31):
kill -l | head -n 31 - 确认某个信号是否存在(脚本安全判断):
kill -l USR1 >/dev/null 2>&1 && echo "supported"
信号编号不是跨平台常量,kill -l 的输出才是你当前系统的唯一事实来源。别抄别人截图里的编号,也别假设 SIGUSR2 一定存在——跑一遍 kill -l 最省事。


















