python - psutil.Process 和 lsof 命令差异

标签 python python-3.x unix file-descriptor psutil

我编写了一个简单的 Python 脚本,用于监视 Red Hat 系统上的文件描述符数量。

lsof 进行比较时命令我得到两个不同的结果。

分解到其核心,该脚本执行以下操作:

import psutil 
p = psutil.Process(PID)
print(p.num_fds())

目前num_fds()报告 60 个打开的文件描述符。 而对于相同的 PID,结果为 lsof -p PID | wc -l产量167

这种差异从何而来?

我的理解是,num_fds()lsof ,两者报告相同的文件描述符,包括打开的文件句柄、套接字、管道等。

小背景:某些进程似乎打开套接字和/或文件句柄,而无需再次关闭它们。因此,经过较长一段时间后,进程达到文件描述符的限制并崩溃。该工具旨在监控此过程,文件描述符的数量是否不断增加。

最佳答案

查看GitHub中的psutil源码,该方法的实现为:

def num_fds(self):
    return len(os.listdir("%s/%s/fd" % (self._procfs_path, self.pid)))

所以它只是计算/proc/pid 或等效位置中列出的文件描述符的数量。

查看我当前在 Red Hat 服务器上的进程,pid 目录包含 5 个文件描述符;但 lsof 报告有 19 个打开的文件。查看完整的 lsof 输出,不同之处在于它列出了似乎与数字文件描述符无关的内容。 lsof 手册页描述:

   FD         is the File Descriptor number of the file or:

                   cwd  current working directory;
                   Lnn  library references (AIX);
                   err  FD information error (see NAME column);
                   jld  jail directory (FreeBSD);
                   ltx  shared library text (code and data);
                   Mxx  hex memory-mapped type number xx.
                   m86  DOS Merge mapped file;
                   mem  memory-mapped file;
                   mmap memory-mapped device;
                   pd   parent directory;
                   rtd  root directory;
                   tr   kernel trace file (OpenBSD);
                   txt  program text (code and data);
                   v86  VP/ix mapped file;

因此,差异是因为 lsof 包含各种实际上未映射到文件描述符的“打开文件”。

关于python - psutil.Process 和 lsof 命令差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67075505/

相关文章:

python - 将 N 个点放入 M 个相等的箱子中

python - 使用 Google App Engine 时出现导入错误

python - pytest -> 如何在类下的测试方法中使用 fixture 返回值

macos - 如何判断来自 "ls"的目录是否是符号链接(symbolic link)?

java - 如何使用 Unix 命令行运行 java 包?

python - 在文本文件中记录标题并用后续数据绘制图表

python - 将gstreamer管道更改为python中的opencv

python - 带括号和不带括号的元组之间的区别?

python-3.x - 将 csv.DictReader 转换为 CSV 文件

php - apache 可以从 PHP 写入但不会提供文件的目录