我用于inotifywait
放置文件的事件触发器。
当监视多个文件时inotifywait
,max_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 特定条目的说明)。选项-c
将grep
让它打印与模式匹配的所有行的计数。
笔记:的计数器inotify_watches
就像其他每用户计数器一样保留在struct ucounts
从用户命名空间结构引用中 - 请参阅include/linux/user_namespace.h
;但我找不到任何将这些计数器暴露给用户空间的界面。