宝塔面板登陆无效 Linux下通过 rm -f 删除大量文件时报错:Argument list too long

问题描述

我们在Vultr服务器中安装了宝塔面板(Vultr注册图文教程),但是宝塔面板在输入用户名密码之后显示登陆成功,但是还在登陆页面。之后通过终端查询命令时显示空间不足

error: db5 error(28) from dbenv->open: No space left on device
error: cannot open Packages index using db5 - No space left on device (28)
error: cannot open Packages database in /var/lib/rpm
Error: Error: rpmdb open failed

查看磁盘占用

[root@iZrj9aay1ndf3vrva7gs11Z ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        918M     0  918M   0% /dev
tmpfs           936M  4.0K  936M   1% /dev/shm
tmpfs           936M   17M  919M   2% /run
tmpfs           936M     0  936M   0% /sys/fs/cgroup
/dev/vda1        40G   33G  4.6G  88% /
tmpfs           188M     0  188M   0% /run/user/0

查看磁盘inode

[root@iZrj9aay1ndf3vrva7gs11Z ~]# df -i
Filesystem      Inodes   IUsed  IFree IUse% Mounted on
devtmpfs        234785     337 234448    1% /dev
tmpfs           239382       3 239379    1% /dev/shm
tmpfs           239382    2171 237211    1% /run
tmpfs           239382      17 239365    1% /sys/fs/cgroup
/dev/vda1      2621440 2621440      0  100% /
tmpfs           239382       5 239377    1% /run/user/0

发现是inode使用率达到了惊人的100%,然后依次查找:

for i in /*; do echo $i; find $i | wc -l; done

最后发现是:/var/spool/postfix/maildrop

这个目录文件过多,接着我们尝试删除文件,出现postfix的大量性能文件时报错

-bash: /bin/rm: Argument list too long

如下图所示:

问题原因


如?待删除文件中包含的小文件数量过多,通常是由于受到 shell 参数个数限制所致。

这个是Linux系统存在的限制,可以通过如下指令查看该参数值的配置:

getconf ARG_MAX

解决办法

  • 删除操作为高风险命令,请一定谨慎使用。确认通过快照等方式对数据进行了有效备份,或者明确可以删除。
  • 如果待处理的文件数目过多,因为处理时间较长,推荐在业务低峰期进行操作,对磁盘的IO消耗较高。
  • 对于 cp、mv 等都可以采取相同的方式实现处理。
  • 请务必核实 dir 定义的目录中除了待删除文件外无其他类型的文件,避免误删?。

可以通过如下方式尝试删除:

结合 awk 删除

可使用 awk 一次删除一个的方式进行删除。但必须先进入该目录下。操作方法如下:

先进入该目标目录:

如图:

使用 awk 删除:

ls -l| awk '{ print "rm -f ",$9}'|sh

如图:

再次使用命令 ls -l 查看,发现文件已经删除完成了.如图:

WeChat