最直接的方法是使用lsof命令和/proc文件系统。lsof可列出进程打开的所有文件,如lsof -p PID;而/proc/<PID>/fd目录则提供文件描述符的底层符号链接视图,通过ls -l /proc/<PID>/fd可查看具体映射。两者结合可高效诊断文件句柄泄露问题。

在Linux系统中,要跟踪一个进程到底打开了哪些文件句柄,最直接且常用的方法是利用
lsof
proc
当我们需要了解一个特定进程当前持有哪些文件句柄时,这通常意味着我们怀疑有资源泄露、性能瓶颈或者需要调试某个应用程序的行为。解决这个问题,我们主要依赖两个核心工具:
lsof
/proc
lsof
lsof -p 12345
而
/proc
/proc
/proc/12345
fd
ls -l /proc/12345/fd/
0 -> /dev/pts/0
1 -> /dev/pts/0
2 -> /dev/pts/0
lsof
readlink
选择哪个工具取决于具体场景。如果需要快速概览和高级过滤,
lsof
lsof
/proc

在我的经验里,文件句柄泄露是很多应用程序长期运行后出现问题的一个隐蔽原因。它不像CPU飙高或内存溢出那样显眼,但其后果同样严重。最直接的迹象就是系统日志中频繁出现“Too many open files”的错误信息。这通常意味着应用程序已经达到了其允许打开文件句柄的最大限制(通过
ulimit -n
/proc/sys/fs/file-max
除了错误信息,你还会观察到一些更间接的症状:
这些问题往往是由于程序代码中忘记关闭文件、套接字、管道或其他IO资源造成的。例如,一个循环中每次都打开文件但从未关闭,或者异常路径下没有执行资源释放逻辑。及时跟踪和诊断文件句柄的使用情况,对于维护系统健康至关重要。

lsof
查找特定进程的所有文件句柄:
lsof -p <PID>
查找某个用户打开的所有文件:
lsof -u <username>
查找特定命令(或其衍生的所有进程)打开的文件:
lsof -c <command_name>
lsof -c nginx
查找哪个进程正在使用某个文件或目录:
lsof /path/to/specific/file
lsof +D /path/to/directory
查找网络连接:
lsof -i
lsof -i :<port>
lsof -i @<IP_address>
结合 grep
lsof -p <PID> | grep "REG"
lsof -p <PID> | grep "sock"
lsof
sock
记住,
lsof
awk
sort
uniq

虽然
lsof
首先,
**proc
ls -l /proc/<PID>/fd/
anon_inode:[eventfd]
ls -l /proc/<PID>/fd/ | wc -l
readlink
其次,
**strace**
strace
strace -p <PID> -e open,openat,close,socket,accept
这个命令会跟踪 PID 为
<PID>
open
openat
close
socket
accept
open
close
strace
strace
最后,对于更宏观、系统级的审计,
**auditd**
lsof
strace
以上就是Linux如何跟踪进程打开的文件句柄的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号