0

0

Linux进程异常终止排查_信号机制分析【技巧】

舞夢輝影

舞夢輝影

发布时间:2026-01-06 19:31:02

|

324人浏览过

|

来源于php中文网

原创

进程被 kill -9 杀掉后找不到日志,因为 sigkill 不可捕获,进程立即终止且不执行任何清理逻辑;需排查 oom_killer、容器运行时、人为 kill 或 systemd 超时等来源。

linux进程异常终止排查_信号机制分析【技巧】

进程被 kill -9 杀掉后为什么找不到日志?

因为 SIGKILL(信号 9)无法被捕获、阻塞或忽略,进程在收到该信号后立刻终止,连清理逻辑(比如写日志、关闭文件描述符)都不会执行。所以你查 systemd 日志、应用自身日志、甚至 strace 跟踪都看不到“主动退出”痕迹。

真正要查的不是“它怎么退出”,而是“谁发了 SIGKILL”。常见来源有:

  • oom_killer:内存耗尽时内核主动干掉进程,会在 dmesg 中留下记录,关键词是 Out of memory: Kill process
  • 容器运行时(如 dockerdcontainerd)因内存 limit 触发 OOM,也会走内核 oom_killer 流程
  • 人为执行了 kill -9,但没留操作记录;可检查 auditd 日志(/var/log/audit/audit.log)中 SYSCALL arch=c000003e syscall=62 success=yes(对应 kill 系统调用)
  • systemdTimeoutStopSec 超时后 fallback 到 SIGKILL,此时 journalctl -u xxx.service 会显示 Stopping timed out. Killing.

如何确认是不是 oom_killer 干的?

直接看内核环形缓冲区:

dmesg -T | grep -i "killed process"

注意时间戳是否与进程终止时间吻合。如果匹配,你会看到类似:

[Wed Jun 12 14:22:35 2024] Out of memory: Kill process 12345 (python3) score 892 or sacrifice child

关键字段解释:

  • score 是 oom_score,数值越高越可能被选中;可通过 cat /proc/12345/oom_score 查看当前值
  • sacrifice child 表示杀的是子进程而非主进程,说明父进程还在,但某个子任务吃光了内存
  • 该日志只存在于内核 log,不会进 journald,也不会写入任何用户空间日志文件

进程收到 SIGTERM 却没响应?检查 signal handler 是否被覆盖

很多程序用 signal()sigaction() 注册 SIGTERM 处理函数,但第三方库(尤其是 C 扩展或嵌入式运行时)可能重置信号行为。典型表现是:手动 kill <pid></pid> 后进程卡住不退出。

Mokker AI
Mokker AI

AI产品图添加背景

下载

验证方式:

  • strace -p <pid> -e trace=signal</pid> 观察是否收到 SIGTERM,以及是否调用了 rt_sigaction 设置 handler
  • 检查进程是否屏蔽了 SIGTERMcat /proc/<pid>/status | grep SigBlk</pid>,输出是十六进制掩码,需转换——SIGTERM 对应 bit 15(从 0 开始计),若该位为 1 则被屏蔽
  • Python 进程尤其容易出问题:若主线程已退出,而子线程仍在运行且未设 daemon=TrueSIGTERM 可能无法触发 atexitsignal.signal() 注册的回调

用 strace 捕获信号传递全过程

strace 是唯一能在用户态看到“信号到达→处理→返回”的工具,但默认不显示信号细节。正确用法是:

strace -e trace=signal,process -f -p <pid>

其中:

  • signal 跟踪 killsigreturnrt_sigprocmask 等信号相关系统调用
  • process 跟踪 forkexecveexit_group,便于关联父子进程行为
  • -f 必须加,否则子线程/子进程的信号事件看不到

典型输出片段:

--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1001, si_uid=0} ---
rt_sigreturn({mask=[]}) = 0
exit_group(143)                     = ?

这表示进程收到了用户态发起的 SIGTERM,执行了信号返回,然后调用 exit_group 正常退出。如果只有第一行而没有后续,说明 handler 没有调用 exit 或被阻塞了。

信号调试最难的一点:它发生在内核和用户交界处,既不能靠源码断点(handler 可能不在你的代码里),也不能靠日志(log 写入本身可能被信号中断)。必须用 straceperf trace -e syscalls:sys_enter_kill 这类内核级观测手段。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

600

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1542

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

715

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

797

2023.07.05

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10万人学习

Git 教程
Git 教程

共21课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号