Tar Asked: 2012-07-06 19:07:04 +0800 CST2012-07-06 19:07:04 +0800 CST 2012-07-06 19:07:04 +0800 CST “查找”是否打开文件? 772 我最近发出了这个命令: find . -type f | wc -l 计算我的 public_html 文件夹中有多少文件。 不久之后,Nginx 返回 500 内部服务器错误并且 error.log 被“太多打开的文件”错误淹没。我想也许这可能是这个问题的根源? nginx find 2 个回答 Voted Best Answer DerfK 2012-07-06T19:23:36+08:002012-07-06T19:23:36+08:00 使用 GNU find(来自 Debian Squeeze 的 4.4.2)查看strace -eopen find . -type f答案似乎是“不,find 不打开文件”,但它确实打开目录: 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 正在再次关闭它们。我制作了一组非常深的目录,似乎 find 用于..上升目录而不是保持目录打开。 不过,这似乎确实是一个非常了不起的巧合。 Alex North-Keys 2012-07-08T01:43:29+08:002012-07-08T01:43:29+08:00 文件是目录,当然,如果 find 没有在运行过程中关闭它们,理论上您在某些 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) ...
使用 GNU find(来自 Debian Squeeze 的 4.4.2)查看
strace -eopen find . -type f
答案似乎是“不,find 不打开文件”,但它确实打开目录:等。当然,所有这些命令都返回相同的文件句柄#,这强烈暗示 find 正在再次关闭它们。我制作了一组非常深的目录,似乎 find 用于
..
上升目录而不是保持目录打开。不过,这似乎确实是一个非常了不起的巧合。
文件是目录,当然,如果 find 没有在运行过程中关闭它们,理论上您在某些 Unixen 上仍然会面临一些微小的风险。运行完整
并查看序列(来自 linux):