我最近发布了这个命令: 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) ...