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 后进程卡住不退出。

验证方式:

飞书多维表格
飞书多维表格

表格形态的AI工作流搭建工具,支持批量化的AI创作与分析任务,接入DeepSeek R1满血版

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

用 strace 捕获信号传递全过程

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

strace -e trace=signal,process -f -p 

其中:

  • 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 这类内核级观测手段。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

734

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

631

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

753

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1258

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

705

2023.08.11

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

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

精品课程

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

共48课时 | 6.7万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

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

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