“find”打开的文件?

我最近发布了这个命令: find . -type f | wc -l find . -type f | wc -l

要统计我的public_html文件夹中有多less个文件。

不久之后,Nginx返回了500个内部服务器错误,并且error.log被“太多打开的文件”错误淹没。 我想也许这可能是这个问题的根源呢?

看着strace -eopen find . -type f strace -eopen find . -type f与GNU查找(4.4.2从Debian挤压)答案似乎是“不,找不打开文件”,但它确实打开目录:

 open("details", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open(".uml", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5 open("..", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_DIRECTORY|O_NOFOLLOW) = 5 open(".dbus", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5 

等等。当然,所有这些命令都返回相同的文件句柄#,这强烈暗示find会再次closures它们。 我做了一个非常深的目录集,似乎find用途..上去一个目录,而不是保持目录打开。

这似乎确实是一个非常了不起的巧合。

文件是目录,当然,如果发现没有closures它们,在理论上,对于某些Unixen来说,这样做风险很小。 运行完整

 strace find . -type f 

并看看序列(从Linux):

 openat(AT_FDCWD, "a", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 6 fchdir(6) = 0 getdents(6, /* 4 entries */, 32768) = 104 getdents(6, /* 0 entries */, 32768) = 0 close(6) ...