本文永久链接: https://www.xtplayer.cn/linux/query-dir-used-by-process/

在容器环境中,有时候可能发现某个容器占用了很大的磁盘空间。如果在特定的目录中没有看到占用空间的文件或者目录,那么可能进程还打开了其他的文件或者目录。

以 rancher 进程为例,在主机上执行以下脚本可以查询到 rancher 进程打开的目录和文件

#!/bin/bash
# 查看指定进程占用的所有目录

PID=$(pgrep rancher)
if [ -z "$PID" ]; then
echo "Usage: $0 <PID>"
exit 1
fi

echo "进程 $PID 的目录信息:"
echo "===================="

# 工作目录
echo -n "工作目录: "
readlink /proc/$PID/cwd

echo -e "\n打开的文件和目录:"
lsof -p $PID | grep -E "(DIR|REG)" | awk '{print $9}' | sort -u

echo -e "\n文件描述符链接:"
for fd in /proc/$PID/fd/*; do
if [ -L "$fd" ]; then
echo "FD $(basename $fd) -> $(readlink $fd)"
fi
done

执行命令后输出以下内容,注意,其中的文件和目录是指的容器内的文件路径和目录。

进程 12445 的目录信息:
====================
工作目录: /var/lib/rancher

打开的文件和目录:
/
(stat:
/usr/bin/rancher
/var/lib/rancher
/var/lib/rancher/informer_object_cache.db
/var/lib/rancher/informer_object_cache.db-shm
/var/lib/rancher/informer_object_cache.db-wal

文件描述符链接:
FD 0 -> /dev/null
FD 1 -> pipe:[84971]
FD 10 -> socket:[626734]
FD 11 -> /var/lib/rancher/informer_object_cache.db-shm
FD 12 -> socket:[89835]
FD 13 -> socket:[93808]
FD 14 -> socket:[94294]
FD 15 -> socket:[93413]
FD 16 -> socket:[541870]
FD 17 -> socket:[539963]
FD 18 -> socket:[503935]
FD 19 -> socket:[89838]
FD 2 -> pipe:[84972]
FD 20 -> /var/lib/rancher/informer_object_cache.db
FD 22 -> socket:[337020]
FD 26 -> /var/lib/rancher/informer_object_cache.db
FD 27 -> socket:[503961]
FD 28 -> socket:[90493]
FD 29 -> /var/lib/rancher/informer_object_cache.db
FD 3 -> socket:[85665]
FD 30 -> /var/lib/rancher/informer_object_cache.db-wal
FD 32 -> socket:[90494]
FD 35 -> socket:[93604]
FD 36 -> socket:[91662]
FD 38 -> socket:[92446]
FD 4 -> anon_inode:[eventpoll]
FD 40 -> /var/lib/rancher/informer_object_cache.db
FD 41 -> /var/lib/rancher/informer_object_cache.db
FD 42 -> /var/lib/rancher/informer_object_cache.db-wal
FD 43 -> socket:[336165]
FD 44 -> /var/lib/rancher/informer_object_cache.db
FD 46 -> /var/lib/rancher/informer_object_cache.db
FD 5 -> anon_inode:[eventfd]
FD 6 -> socket:[85671]
FD 62 -> socket:[91890]
FD 7 -> socket:[85673]
FD 8 -> socket:[83942]
FD 9 -> /var/lib/rancher/informer_object_cache.db