如何获取被OOM杀死进程的PPID?Docker容器进程归属排查
如何定位OOM杀死的Docker进程所属容器及获取PPID
嘿,这个场景我再熟悉不过了——Docker环境下OOM杀了进程但找不到对应容器确实头疼,给你一步步来解决:
第一步:获取被杀死进程的PPID
如果进程还没被彻底清理(概率较低,但可以先试),直接用ps命令查询:
ps -o ppid= -p 165480
解释一下:-o ppid=指定只输出父进程ID(PPID),-p指定要查询的目标进程ID。
如果进程已经被销毁,ps查不到的话,就去系统日志里挖细节:
- 查看
/var/log/messages的更多上下文:
grep -A 15 -B 5 "165480" /var/log/messages
有时候内核会在OOM日志后面输出进程树的更多信息,里面可能包含PPID。
- 或者用
dmesg查看内核环缓存的OOM相关日志:
dmesg | grep -A 20 -B 5 "Out of memory: Kill process 165480"
第二步:关联PPID到Docker容器
拿到PPID后,我们可以通过三种方式找到对应的容器:
方式1:通过进程树反向查找
先查看PPID对应的进程信息:
ps -ef | grep <你的PPID>
Docker容器的入口进程的父进程通常是containerd-shim或者docker守护进程,你可以顺着进程树往上找,找到带有容器ID标识的进程,然后用容器ID查询容器详情:
docker inspect <容器ID>
方式2:遍历所有容器查找目标进程
如果不想手动捋进程树,直接遍历所有运行中的容器,检查哪个容器包含目标进程(即使进程已死,有些容器的进程历史可能还能查到,或者用PPID查询):
for container in $(docker ps -q); do echo "检查容器: $(docker inspect --format '{{.Name}}' $container) ($container)" docker top $container | grep -E "165480|<你的PPID>" done
方式3:通过cgroup定位(最准确)
每个Docker容器的进程都属于专属的cgroup,如果进程还存在,查看它的cgroup信息:
cat /proc/165480/cgroup
输出里会有类似docker/abcdef123456...的路径,其中abcdef123456就是容器ID的前缀,直接用这个ID查容器:
docker ps -a | grep abcdef123456
如果进程已死,还是回到dmesg或/var/log/messages,有些内核版本会在OOM日志中输出进程所属的cgroup路径,直接提取容器ID即可。
内容的提问来源于stack exchange,提问作者workhardcc
相关产品推荐
相关产品推荐

