mku*_*urz 3 file-server debian watch
作为工作的一部分,我使用几个不同的 Nodejs 实时服务器,并且我的工具/工作流程中似乎存在某种泄漏,导致文件观察器随着时间的推移而累积,直到达到系统限制。然后我收到以下 cli 错误:
Error from chokidar (<path-to-folder>): Error:
ENOSPC: System limit for number of file watchers reached, watch '<path-to-folder>/<filename>'
Run Code Online (Sandbox Code Playgroud)
我发现以下命令应该返回使用的 wile 观察者的数量:
find /proc/*/fd -user "$USER" -lname anon_inode:inotify -printf '%hinfo/%f\n' 2>/dev/null | xargs cat | grep -c '^inotify'
Run Code Online (Sandbox Code Playgroud)
它返回 515160,尽管我似乎已经关闭了所有实时服务器。我有两组问题:
我运行的是 Debian 11
您提供的命令正在搜索其中有符号链接的/proc任何文件描述符。报告这些进程的命令和 PID,以及设置的监视数量也非常简单:/proc/*/fd/anon_inode:inotify
#!/bin/bash
cd /proc
for p in [0-9]*
do cd $p
if find fd -user "$USER" -lname anon_inode:inotify 2>/dev/null | grep -q .
then IFS= read -d '' cmd < cmdline
numwatch=$(cat fdinfo/* | grep -c '^inotify')
[[ $numwatch -ge 1 ]] && printf '%s\n PID %s\t %s watches\n' "$cmd" "$p" "$numwatch"
fi
cd ..
done
Run Code Online (Sandbox Code Playgroud)
事实上,我发现oligofren已经编写了一个类似的脚本inotify-consumers作为 答案,它具有更漂亮的格式输出。
然而,找到实际被监视的路径却变得更加复杂。您只有来自 的 inode /proc/*/fdinfo,因此您必须搜索整个文件系统以找到映射到 inode 的路径。这是一项昂贵的操作。
有一个 C++ 程序inotify-info可以执行此操作;也从这里的答案中找到。我刚刚在我的机器上构建了它并且它可以工作。不带参数运行,它只是列出每个进程的监视数量,与 inotify-consumers 脚本相同。给定特定的命令名称或 PID,它还会搜索该进程监视的 inode 的路径。
杀死所有观察者可能不是一个好主意,但是在查看哪些进程正在使用大量观察者之后,您可以做出明智的选择。