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

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

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

当监视多个文件时inotifywaitmax_user_watches超过时,会出现以下错误。

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

调是必须的/proc/sys/fs/inotify/max_user_watches,但是可以查看当前文件的watch号吗?

有没有办法检查像文件编号在文件描述符中?

答案1

我拼凑起来这个小脚本基于@mosvy的回答。自最初构思以来,它已经取得了不少进步(旧系统上的稳定性、总数、速度)。在大多数普通的机器,运行它应该花费不到 100 毫秒。

   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

2023 更新:使用本机版本

Michael Sartain 重新创建了此功能(并添加了一些改进)作为本机 (C++) 二进制文件 (inotify-信息),所以如果你能抽出几秒钟来完成构建步骤,他的项目本质上使我的脚本变得多余,因为它在各个方面都更好。超级快!


答案2

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

find /proc/*/fd -user "$USER" -lname anon_inode:inotify \
   -printf '%hinfo/%f\n' 2>/dev/null |
   xargs cat | grep -c '^inotify'

更改"$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 特定条目的说明)。选项-cgrep让它打印与模式匹配的所有行的计数。

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

相关内容