最近线上 elasticsearch 由于磁盘空间不足报错,于是乎对磁盘进行了分析,删除了一些 Tomcat 日志文件,但是删除后发现并没有磁盘空间释放。于是 google 了一下。
原来在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink),然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。而我删除的是正在运行中的 Tomcat 的 logs,删除的时候文件正在被使用中。
Linux 使用 lsof | grep deleted
命令获得一个已经被删除但是仍然被应用程序占用的文件列表,kill 掉相关进程即可强制要求系统回收分配给正在使用的的文件。或者也可以将文件占用取消,比如当前场景可以让 Tomcat 关闭即可取消文件占用。
(lsof
全名 list opened files
,也就是列举系统中已经被打开的文件。)
在网上还看到了一种方法,使用 echo " " > logs/xxx.log
通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法用于在线清理 Apache
、Tomcat
、Nginx
等 Web
服务产生的日志文件相当实用。
本文由个人 hexo 博客 co2fe.com 迁移
date: 2018-11-21 16:53:29