周六的时候接到一台服务器磁盘空间100%的告警,和平时一样登陆上服务器准备删掉点日志,却发现日志文件已经被删掉了,很是费解既然没有日志被删掉了为啥还能导致磁盘占满了呢?
df和du看一下磁盘空间
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 251G 251G 0 100% /data
/data目录果然显示占满了,赶紧查看下哪些文件导致的
du -h --max-depth=1 /data
62G /data/log
62G /data
这里/data/log只占用了62G,log日志明明被删除了,为啥磁盘还是被占用?
google了一番,发现很多人都碰到了这个问题,原因如下:
在Linux或者Unix系统中,通过rm或者文件管理器删除文件,只是将它会从文件系统的目录结构上解除链接(unlink),也就是说只是删除了文件和系统目录结构的链接;如果文件在删除时是被打开的(有一个进程正在使用该文件,文件被进程锁定或者有进程一直在向这个文件写数据等)状态,那么进程将仍然可以读取该文件,也就是说没有删除掉文件在读取的状态,所以磁盘空间也就会一直被占用。
看到这里我就明白了,赶紧ps了一下是不是有python进程没退出(因为我这里是会多进程处理,可能某些原因导致进程未正常退出),果然有异常进程,直接kill掉,在df一下磁盘空间已经释放了
这里同时摘抄一下网络上提供的其他方法:
- 通过lsof|grep deleted命令获取到已经被删除但是仍然被应用程序占用的文件列表,然后kill掉还在占用所删除文件的进程。需要注意的是:如果有很多进程都在使用所删除文件,那么采用第1种方式kill进程就有点麻烦了,而且风险也比较大。因为kill进程是通过截断proc文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。必须要确定不会对运行中的进程造成影响时才能使用,应用程序对这种方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题。
- 或停掉或重启使用这个所删除文件的应用,让OS自动回收磁盘空间。
- 也可以重启操作系统,不过这并不是最好的方法
- 对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件。通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志。
小分析一下:
第一种方式是未被释放的文件可能被多个进程使用,这种情况下强行截断文件会对运行中的进程有影响
第二种方式就是直接kill进程,也是我采用的方式,因为这里我确认没有其他进程用这个日志了,这里第一和第二加起来才算一种方式吧,不知道原作者这里为啥要分开
第三种重启系统,这? 不到万不得已,一般人不会这么干吧
第四种清空这个文件,这个是对第一种方式的一种补充(我比较推荐),大概的用法就是如下:
> xxx.log