lsof
按照建议使用打开的文件太多——如何找到罪魁祸首unity-2d-
我发现数以千计的文件是由诸如、gnome-do
和等操作系统风格的程序打开的nautilus
。前 50 个中只有一个是应用程序风格的程序(firefox)。
lsof | perl -lane '$x{"$F[0]:$F[1]"}++;
END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}' | tail -50
lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /var/lib/lightdm/.gvfs
Output information may be incomplete.
216 unity-2d-:26285
216 unity-2d-:31600
216 unity-2d-:2577
239 nautilus:30626
239 nautilus:3777
239 nautilus:31250
239 nautilus:30781
239 nautilus:15101
241 nautilus:26123
241 nautilus:20495
241 nautilus:9627
241 nautilus:31612
241 nautilus:26298
243 nautilus:7672
243 nautilus:603
243 nautilus:21594
243 nautilus:2590
243 nautilus:17574
243 firefox:9768
243 nautilus:12422
247 nautilus:14265
256 gnome-do:31632
256 gnome-do:20519
256 gnome-do:26318
256 gnome-do:9647
256 gnome-do:26143
257 gnome-do:12437
257 gnome-do:14284
257 gnome-do:21612
257 gnome-do:622
257 gnome-do:7686
257 gnome-do:2608
257 gnome-do:17603
270 unity-2d-:3756
270 unity-2d-:30612
272 unity-2d-:15087
277 unity-2d-:12408
277 unity-2d-:21580
278 unity-2d-:2576
278 unity-2d-:14251
278 unity-2d-:587
279 unity-2d-:9613
279 unity-2d-:30768
279 unity-2d-:20481
280 unity-2d-:26109
281 unity-2d-:26284
283 unity-2d-:31599
284 unity-2d-:31235
288 unity-2d-:7658
290 unity-2d-:17559
这是正常的吗?还是有什么问题?
答案1
是的,这是正常的。操作系统可以随时同时打开数千个文件。例如,此时我的系统已打开 5858 个文件。
$ lsof | wc -l
5858
请注意,lsof
默认情况下列出所有由所有流程。因此,如果一个文件被两个不同的进程访问,lsof 输出中就会有两个不同的实例。
还请注意,该文件并非都是常规文件。lsof 手册说
打开的文件可以是常规文件、目录、块特殊文件、字符特殊文件、执行文本引用、库、流或网络文件(Internet 套接字、NFS 文件或 UNIX 域套接字)。可以通过路径选择文件系统中的特定文件或所有文件。
但有一个微妙的区别打开文件和打开文件描述符。 看本文阅读这个有趣的话题。重点是
什么是打开文件?
打开的文件是正在使用的文件,还是打开的文件描述符?文件描述符是程序用来获取文件句柄的数据结构,最广为人知的是 0、1、2,分别表示标准输入、标准输出和标准错误。file-max 内核参数指的是打开的文件描述符,file-nr 则给出当前打开的文件描述符的数量。但 lsof 会列出所有打开的文件,包括未使用文件描述符的文件 - 例如当前工作目录、内存映射库文件和可执行文本文件。为了说明这一点,让我们检查一下给定 pid 的 lsof 输出与 /proc 中为该 pid 列出的文件描述符之间的差异。
另请查看这些链接