【Linux】解决删除文件时提示“too many open files”错误
摘录自:https://blog.csdn.net/qq_43076479/article/details/121860838
1.3 更改文件描述符限制
当碰到“too many open files”错误时,就需要增加文件描述符的限制数量,系统的默认文件描述符都比较大,一般来说,只需增加用户或进程的就可以了
//用户或进程
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]# ulimit -n 10240
[root@localhost ~]# ulimit -n
10240
注意,使用ulimit 命令更改后只是在当前会话生效,当退出当前会话重新登录后又会回到默认值1024,要永久更改可以修改文件 /etc/security/limit.conf,如
[root@localhost ~]#vi /etc/security/limits.conf
加入 “abc hard nofile 10240”
abc:用户名,即允许test使用ulimit命令更改FD限制,最大值不超过10240,更改后abc用户的每一个进程(以abc用户运行的进程)可打开的FD数量为10240个
hard:限制类型,有soft/hard两种,达到soft限制会在系统的日志(一般为/var/log/messages)里面记录一条告警日志,但不影响使用。hard,达到这个限制,有日志且会影响使用。
nofile:限制的内容,nofile - max number of open files
1024 :值
更改后,退出终端重新登录,用ulimit看看有没有生效,如果没生效,可以在abc用户的.bash_profile文件加上 ulimit -n 10240 ,以使用户abc每次登录时都会将FD最大值更改为10240,如:
[root@localhost ~]#echo "ulimit -n 10240" >> /home/abc/ .bash_profile
10240
[root@localhost ~]# su - abc
[abc@localhost ~]$ ulimit -n
10240
limit.conf文件里面本身已有很详细的使用方法,这个下次可以说说。
//系统级别
将整个操作系统可以使用的FD数量更改为51200
[root@localhost ~]# echo "51200" > /proc/sys/fs/file-max
[root@localhost ~]# cat /proc/sys/fs/file-nr
1184 0 51200
像这样更改在系统重启后会恢复到默认值,要永久更改可以在sysctl.conf文件加上fs.file-max = 51200
如:
[root@localhost ~]# echo "fs.file-max = 51200" >> /etc/sysctl.conf
二、获取打开的文件数量
linux的一切皆为文件,那么如何知道系统/应用打开了哪些或是多少个文件呢?很简单,用lsof命令就行了,lsof,list open files的简写,可列出程序或系统正在使用的文件。
2.1 获取整个系统打开的文件数量
[root@localhost ~]# lsof |wc -l
1864
2.2 获取某个用户打开的文件数量
[root@localhost ~]# lsof -u test |wc -l
15
1
2
2.3 获取某个程序打开的文件数量
[root@localhost ~]# pidof vim
3253
[root@localhost ~]# lsof -p 3253 |wc -l
31
上面所示只是用lsof来显示已打开的文件数量,lsof的功能远不止这些,有兴趣可以man lsof看一下
三、进程打开的文件描述符与文件
如前面说的,为什么说“too many open files”错误不是说打开的文件过多,而是打开的文件描述符数量已达到了限制,这个简单的可以用man ulimit就可得知
[abc@localhost ~]$ man ulimit
1
//找到ulimit,可以看到下列一行
-n The maximum number of open file descriptors (most systems do not allow this value to be set)
这行就说明了用ulimit -n xxx 更改的是文件描述符而不是文件的最大值。
我们可以来测试一下:
打开一个进程vim,获取vim打开的文件及文件描述符数量
[abc@localhost ~]$ lsof -p 3330 |wc -l //文件数量
31
[abc@localhost ~]$ ls /proc/3330/fd |wc -l //文件描述符数量
4
[abc@localhost ~]$ killall -9 vim
[1]+ 已杀死 vim .bash_profile
[abc@localhost ~]$ ulimit -n 20
更改限制,并测试vim的运行情况
[abc@localhost ~]$ ulimit -n 20 //更改为20,即小于文件数量31
[abc@localhost ~]$ ulimit -n
20
[abc@localhost ~]$ vim .bash_profile //可看到vim可以正常打开文件
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
ulimit -n 10240
----------------------------------
[abc@localhost ~]$ ulimit -n 3 //更改为3,即小于FD数量4
[abc@localhost ~]$ ulimit -n
3
[abc@localhost ~]$ vim .bash_profile
-bash: start_pipeline: pgrp pipe: Too many open files
vim: error while loading shared libraries: libselinux.so.1: cannot open shared object file: Error 24
从上面可看到小于文件描述符的数值时即报“Too many open files”错误,那么这个应该可以说明这个“Too many open files”错误是是打开的文件描述符数量已达到了限制所引起的,跟打开的文件数量没有关系。
————————————————