作为我工作的一部分,我使用几个不同的 nodejs 实时服务器,我的工具/工作流程中似乎存在某种泄漏,导致文件观察者随着时间的推移而积累,直到它们达到系统限制。然后我得到以下cli错误:
Error from chokidar (<path-to-folder>): Error:
ENOSPC: System limit for number of file watchers reached, watch '<path-to-folder>/<filename>'
我发现以下命令应该返回使用的诡计观察者的数量:
find /proc/*/fd -user "$USER" -lname anon_inode:inotify -printf '%hinfo/%f\n' 2>/dev/null | xargs cat | grep -c '^inotify'
它返回 515160,即使我似乎已经关闭了所有实时服务器。我有两组问题:
- 我该如何诊断?我可以获得所有已注册观察者的列表、他们的观察路径和相应的 PID 或类似的东西吗?
- 有没有办法让我把他们都杀了?杀死所有文件观察者是个好主意吗?我可以只杀死我的服务器注册的观察者吗?
我正在运行 Debian 11
您提供的命令正在搜索其中符号链接
/proc
到. 报告这些进程的命令和 PID 以及设置的监视数量也非常简单:/proc/*/fd/
anon_inode:inotify
事实上,我发现 oligofren 已经编写了一个类似的脚本inotify-consumers作为 答案,它的输出格式更好。
然而,找到被监视的实际路径变得更加复杂。您只有来自 的 inode
/proc/*/fdinfo
,因此您必须搜索整个文件系统以找到映射到 inode 的路径。这是一项昂贵的操作。有一个 C++ 程序inotify-info可以做到这一点;也从这里的答案中找到。我只是在我的机器上构建它并且它可以工作。不带参数运行,它只列出每个进程的监视数,与 inotify-consumers 脚本相同。给定一个特定的命令名称或 PID,它还会搜索该进程监视的 inode 的路径。
杀死所有观察者可能不是一个好主意,但在查看哪些进程正在使用大量观察者之后,您可以做出明智的选择。