在 CentOS 上排查进程崩溃(进程异常退出、Segmentation fault、OOM、core dump 等),可以按下面一套流程来,从“有没有留下痕迹”到“定位代码/环境原因”。
进程是怎么没的
看退出码
echo $?
常见:
139 → SIGSEGV(段错误)134 → SIGABRT137 → SIGKILL(常被 OOM)sudo dmesg | tail -50
或
sudo less /var/log/messages
sudo less /var/log/dmesg
重点看:
segfaultout of memorykilled process示例(段错误):
app[1234]: segfault at 0 ip 0000... sp 0000... error 4
示例(OOM):
Out of memory: Kill process 1234 (java)
dmesg -T | grep -i "oom"
dmesg -T | grep -i "killed process"
free -h
top
ulimit -c
如果是 0,说明没开。
ulimit -c unlimited
编辑:
sudo vim /etc/security/limits.conf
加:
* soft core unlimited
* hard core unlimited
cat /proc/sys/kernel/core_pattern
常见:
core.%e.%p
gdb /path/to/binary core.xxx
常用:
bt
bt full
info registers
hs_err_pid*.logpython app.py
看 traceback
或:
ulimit -c unlimited
gdb + valgrind如果是 systemctl 启动的:
journalctl -u your-service -n 100 --no-pager
journalctl -u your-service --since "1 hour ago"
看:
| 原因 | 排查点 |
|---|---|
| 段错误 | core + gdb |
| OOM | dmesg / free |
| 依赖缺失 | ldd |
| 权限问题 | /var/log/audit/audit.log |
| 磁盘满 | df -h |
| 文件描述符满 | ulimit -n |
| 线程数爆 | ps -eLf |
journalctl / dmesg如果你愿意,可以告诉我:
我可以直接帮你“对着日志定位原因”。