在Ubuntu 16.04上达到了inotify监视器的用户限制。

我刚刚安装了Ubuntu 16.04,当我启动SmartGit时,出现了这个警告。
IOException: User limit of inotify watches reached

此外,我在运行tail -f时收到了这个警告。
tail: inotify resources exhausted 

tail: inotify cannot be used, reverting to polling

我在新的Ubuntu上使用的应用程序和文件与之前的版本几乎相同,从来没有遇到过这个错误。
唯一的区别是我在电脑上添加了一个额外的硬盘,并配置了Ubuntu的备份工具。这个问题是否与第二个硬盘或备份工具有关呢?

4http://unix.stackexchange.com/questions/13751/kernel-inotify-watch-limit-reached? - muru
3个回答

当前在Xenial上的默认值是8192(请参见内核源代码中的fs/notify/inotify/inotify_user.c),您可以通过将文件打印到stdout来验证此值:
cat /proc/sys/fs/inotify/max_user_watches
8192

你可以增加这个数字,例如将其翻倍到16384,使用以下方法:
echo 16384 | sudo tee /proc/sys/fs/inotify/max_user_watches

请记住,inotify监视会消耗内存,我认为在64位系统上每个监视大约占用160字节的内存。
要永久设置这个,请在/etc/sysctl.conf中添加一条记录,例如:
echo fs.inotify.max_user_watches=16384 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

..或手动编辑/etc/sysctl.conf(您需要root权限进行更新),然后运行sudo sysctl -p


是的,谢谢。我将它加倍了,现在我不再收到警告了。16.384个手表将消耗多少内存(最大值)?我的计算大约是2.5MB。这正确吗? - Andrea
在那个顺序中的某些项目,再加上一些额外开销;从整体来看,并不算太大。 - Colin Ian King
1这是关于(已使用的)手表可能的内存消耗的更多信息:https://askubuntu.com/questions/154255/how-can-i-tell-if-i-am-out-of-inotify-watches - michael
/etc/sysctl.d/中添加一个新文件,内容为fs.inotify.max_user_watches = 16384,这样做是一样的,对吗?但是在Ubuntu 20.04中,它不起作用。然而,在/etc/sysctl.conf中添加一行新内容是有效的。 - fikr4n

以上的答案都很好,但并没有解释为什么,这让我一直在寻找一个完整的答案。
为什么?
像Dropbox、Git等文件同步程序使用inotify来检测文件系统的变化。可以通过以下方式查看限制:
cat /proc/sys/fs/inotify/max_user_watches

对我来说,它显示100000。当这个限制不足以监控目录中的所有文件时,它会抛出此错误。

增加 inotify 监听者数量(简版):

如果你正在运行 Debian、RedHat 或其他类似的 Linux 发行版,请在终端中运行以下命令:

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

如果你正在使用 ArchLinux,请运行以下命令代替(请参考这里了解原因):
echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system

然后将其粘贴到您的终端,按回车键运行。

技术细节:

Listen 在 Linux 上默认使用 inotify 来监视目录的变化。在监视文件数量方面,系统限制是很常见的。例如,Ubuntu Lucid(64位)的 inotify 限制被设置为 8192。

您可以通过执行以下命令来获取当前的 inotify 文件监视限制:

$ cat /proc/sys/fs/inotify/max_user_watches

当此限制不足以监视目录中的所有文件时,必须增加限制才能使“监听”正常工作。
您可以使用以下命令临时设置新的限制:
$ sudo sysctl fs.inotify.max_user_watches=524288
$ sudo sysctl -p

如果您希望将限制永久生效,请使用以下方法:
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p

你可能还需要注意max_queued_events和max_user_instances的值,如果Listen一直在抱怨的话。
来源:https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers

您可以检查现有的限制,并根据需要进行修改。

检查:cat /proc/sys/fs/inotify/max_user_watches 修改:sudo sysctl fs.inotify.max_user_watches=524288

这将解决该错误。