PHP写的网站出现报错,我的服务器系统是ubuntu18
Warning: session_start(): open(/var/lib/php/sessions/sess_lis1vnf4as8ffb85sghjp1t2v0, O_RDWR) failed: No space left on device (28) in /home/xxxx/Controller.php on line 16
服务器连接不上,重启服务器后,想创建文件夹或者文件都会提示空间不够
mkdir: cannot create directory ‘/sdc’: No space left on device
使用df -h
命令发现空间还有,但是就是显示磁盘空间不够
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 396M 9.1M 387M 3% /run
/dev/vda1 40G 14G 24G 37% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
tmpfs 396M 0 396M 0% /run/user/0
后来参考了一篇文章https://blog.csdn.net/weixin_45607084/article/details/107436712
发现是系统盘inode 即索引节点占用满了,什么是索引节点可以点击链接看一下她这篇文章的内容。
使用命令查看df -i
,果真是索引节点被占满了,IUse占用100%
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 500247 415 499832 1% /dev
tmpfs 505739 1314 504425 1% /run
/dev/vda1 2621440 2621440 0 100% /
tmpfs 505739 1 505738 1% /dev/shm
tmpfs 505739 4 505735 1% /run/lock
tmpfs 505739 16 505723 1% /sys/fs/cgroup
tmpfs 505739 5 505734 1% /run/user/0
于是,参考链接找到对应目录使用最多的文件夹
for i in /*; do echo $i ; find $i | wc -l; done
上述命令一直递进找,例如我这找到的是/var目录下文件最多
/proc
72763
/root
42
/run
1321
/sbin
227
/snap
2
/srv
1
/sys
60983
/tmp
10
/usr
123283
/var
2198876
/vmlinuz
1
/vmlinuz.old
1
然后修改上述代码,继续查找,如下
for i in /var/*; do echo $i ; find $i | wc -l; done
一直找,我是最终找到了php下的sessions文件夹中,发现占用了两百多万个目录
/var/lib/php/modules
106
/var/lib/php/sessions
2185349
这里我直接用rm -rf *
但是太多文件了,删不掉
bash: /bin/rm: Argument list too long
可以使用命令
ls | xargs -n 10 rm -fr ls
命令解释为:输出所有的文件名(用空格分割) xargs就是将ls的输出,每10个为一组(以空格为分隔符),作为rm -rf的参数也就是说将所有文件名10个为一组,由rm -rf删除
删除结束后再此查看sessions的目录数量,并且查看整体的Inode占用比,可以发现已经正常
root@ecs-c6s-large-2-linux-20201130215441:/var/lib/php/sessions# for i in /var/lib/php/sessions/; do echo $i ; find $i | wc -l; done
/var/lib/php/sessions/
1409
root@ecs-c6s-large-2-linux-20201130215441:/var/lib/php/sessions# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 500247 415 499832 1% /dev
tmpfs 505739 1313 504426 1% /run
/dev/vda1 2621440 437525 2183915 17% /
tmpfs 505739 1 505738 1% /dev/shm
tmpfs 505739 4 505735 1% /run/lock
tmpfs 505739 16 505723 1% /sys/fs/cgroup
tmpfs 505739 5 505734 1% /run/user/0
这里恢复正常了,网站也能够正常访问了,基本问题解决,但是为了避免session再次产生这种问题,设置一个自动删除shell脚本,1小时清理一次,清理大于5个小时的session文件。
在目录/etc/cron.hourly
下创建session文件
写入如下代码
find /tmp/session -amin +300 -exec rm -rf {} \;
然后重启cron服务
root@ecs-c6s-large-2-linux-20201130215441:/etc/cron.hourly# pgrep cron
784
root@ecs-c6s-large-2-linux-20201130215441:/etc/cron.hourly# service cron restart
root@ecs-c6s-large-2-linux-20201130215441:/etc/cron.hourly# pgrep cron
27927
发现端口号变了,重启成功,这样下来Session就不会多的太厉害。问题解决。