当我尝试时tail -f catalina.out
,出现错误:
tail: inotify cannot be used, reverting to polling: Too many open files
我尝试了这篇文章中的答案: 打开的文件太多——如何找到罪魁祸首
lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
当我运行上述命令时,输出是
17 6115
13 6413
10 6417
10 6415
9 6418
9 6416
9 6414
8 6419
4 9
4 8
我没有看到任何进程打开了 1024 个文件。打开的文件数不是 17、13、10、10、9 吗?还是我理解错了?所有这些都是 bash、sshd、apache2,tomcat 的数字是 4。
我也执行了,lsof | grep tail | wc -l
返回了20
。这些数字并不大,那么为什么会tail -f catalina.out
失败呢?
答案1
按照以下说明,这个问题已经解决了http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html
永久解决方案(重启后保留)添加行:
fs.inotify.max_user_watches=1048576
到:
/etc/sysctl.conf
永久修复限制值(即使在重启之间)。
然后做一个
sysctl -p
答案2
我认为那个答案不完整(它没有说明系统上打开文件的最大限制)。
关于最大打开文件数有两个限制:
打开文件的最大限制每个进程。
- 您可以使用以下方法查看此限制的值:
ulimit -n
- 您可以使用以下方法更改此限制:
ulimit -n new_limit_number
下面是一个获取打开较多文件的前 10 个进程的命令:
lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
- 您可以使用以下方法查看此限制的值:
打开文件的最大限制每个系统。
- 您可以使用以下方法查看此限制的值:
cat /proc/sys/fs/file-max
- 您可以使用以下方法更改此限制:
echo new_limit_number > /proc/sys/fs/file-max
- 计算所有打开的文件句柄:
lsof | wc -l
- 您可以使用以下方法查看此限制的值:
答案3
sysctl fs.inotify.max_user_instances
将获得每个用户的限制inotify
。
我经历过,系统范围内的所有限制都足够高,但用户设置通常默认相对较低,您可以增加它sysctl.conf
并重新加载它sysctl -p
。
答案4
跑步
ps aux | grep tail
检查是否有太多的尾部命令正在运行,例如由 crontab 生成的命令。