如何获取正在使用的inotify手表的数量

9 linux inotify

inotifywait用于放置文件的事件触发器。

当很多文件被 观看时inotifywait,当max_user_watches超过时,会出现以下错误。

因 inotify 监视而终止。#012考虑增加 /proc/sys/fs/inotify/max_user_watches

需要调整/proc/sys/fs/inotify/max_user_watches,但是可以查看当前文件监视号吗?

有没有办法像文件描述符中的 file-nr一样检查?

oli*_*ren 16

我根据@mosvy 的回答拼凑了这个小脚本。自最初的概念以来,它已经看到了很多改进(旧系统的稳定性、总数、速度)。在大多数普通机器上,运行它应该不到 100 毫秒。尽管它比我最初制作时的其他替代方案快得多,但Simon Matter为重载的 Big Iron Linux(数百个内核)添加了一些速度增强功能,极大地加快了速度,将其从 10 分钟(!)减少到 15 分钟秒。

   INOTIFY
    WATCH
    COUNT     PID USER     COMMAND
--------------------------------------
    3044   3933 myuser node /usr/local/bin/tsserver
    2965   3941 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/bin/tsserverForkStart /hom
     979   3954 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/node_modules/typescript/li
       1   3899 myuser /usr/local/bin/node --no-warnings /home/myuser/dev/dotfiles/common-setup/vim/dotvim/plugged/coc.nvim/build/i

    6989  WATCHES TOTAL COUNT
Run Code Online (Sandbox Code Playgroud)


mos*_*svy 8

我希望我能用更聪明的方式回答,但我发现计算inotify(7)用户设置的手表的唯一方法是:

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)

"$USER"与您想要了解的实际用户进行更改; "`id -u`"对于当前用户。请注意,这max_user_watches是每个用户的限制,而不是每个进程或每个 inotify 实例/文件描述符。

这将首先find创建所有打开的文件描述符inotify_init*(2),然后将查看相应的/proc/PID/fdinfo/FD文件以获取有关添加inotify_add_watch(2)到每个文件的监视描述符的信息(查看下面的proc(5)联机帮助页以/proc/[pid]/fdinfo/了解特定于 inotify 的条目的描述)。该-c的选项grep将让它打印模式匹配的所有行的计数。

注意: for 的inotify_watches计数器struct ucounts与用户命名空间结构中引用的其他每用户计数器一样保留- 请参阅include/linux/user_namespace.h;但我找不到任何将这些计数器暴露给用户空间的界面。