Linux服务器文件删除策略
磁盘空间满
由于Linux没有回收站功能,所以线上服务器上所有要删除的文件都会先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据。这个策略本身没有问题,但是通过检查发现这台服务器的系统分区中并没有单独划分/tmp分区,这样/tmp下的数据其实占用了根分区的空间。既然找到了问题,那么删除/tmp目录下一些占空间较大的数据文件即可,检查/tmp下最大的三个数据文。
du -sh /tmp/* | sort -nr | head -3
查看/tmp下最大的前三个数据文件 通过命令输出发现在/tmp目录下有个66GB大小的文件access_log,这个文件应该是Apache产生的访问日志文件,从日志大小来看,应该是很久没有清理Apache日志文件了,基本判定是这个文件导致的根空间爆满,在确认此文件可以删除后,执行如下删除操作:
rm /tmp/access_log
接着查看系统根分区空间是否释放,从输出可以看到,根分区空间仍然没有释放,这是怎么回事?
删除文件空间不释放
一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等,要理解这个问题,就需要知道Linux下文件的存储机制和存储结构。
文件的数据与指针部分
一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以在出现删除access_log文件后,空间还没释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了access_log文件,但是由于进程锁定,文件对应的指针部分并未从meta-data中清除,而由于指针并未删除,系统内核就认为文件并未删除。
查找被应用程序占用的已删除文件列表
因此通过df命令查询空间并未释放也就既然有了解决问题的思路,那么接下来看看是否有进程一直在向access_log文件中写数据,这里需要用到Linux下的lsof命令,通过这个命令可以获取一个仍然被应用程序占用的已删除文件列表:
lsof | grep delete
从输出结果可以看到,/tmp/access_log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据。从第7列可知,这个日志文件大小约70GB,而系统根分区总大小才100GB,由此可知,这个文件就是导致系统根分区空间耗尽的罪魁祸首。最后一列的“deleted”状态说明这个日志文件已经被删除,但由于进程还在一直向此文件写入数据,因此空间并未释放。
正确地清空文件
解决这一类问题的方法有很多种,最简单的方法是关闭或重启httpd进程,当然也可以重启操作系统,不过这些并不是最好的方法。对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体可以通过如下命令完成:
[root@localhost ~]# echo " " /tmp/access_log
通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。
本文作者:佚名 来源:51CTOAndroid C++系列:Linux文件IO操作(二) 注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写 位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O缓冲区中,再返回第一 个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中记录的读写位置是 1。
Android C++系列:Linux文件IO操作(一) 事实上Unbuffered I/O这个名词是有些误导的,虽然write系统调用位于C标准库I/O缓 冲区的底层,但在write的底层也可以分配一个内核I/O缓冲区,所以write也不一定是直接 写到文件的,也可能写到内核I/O缓冲区中,至于究竟写到了文件中还是内核缓冲区中对于 进程来说是没有差别的,如果进程A和进程B打开同一文件,进程A写到内核I/O缓冲区中的数 据从进程B也能读到,而C标准库的I/O缓冲区则不具有这一特性(想一想为什么)
相关文章
- Linux-鸟菜-6-文件与目录管理
- linux下的sh文件变成可执行文件
- linux查看服务安装目录
- Linux系统中运行.sh文件的几种方法
- 7招之内,最低配置 linux也能挖出巨大宝藏
- CairoPlot 让 Linux 服务器的日志文件更直观
- 12款Linux终端替代品
- Linux 命令神器:lsof 入门
- Linux有问必答:如何在Linux下重命名多个文件
- LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件
- 如何让 Linux 下非 root 用户程序使用小于 1024 端口
- 使用od命令,linux下以ASCII方式查看文件
- Linux 文件转码
- linux下为目录和文件设置权限
- linux中增加swap分区文件的步骤方法
- linux下split切割的文件如何合并
- uboot向linux传递输出任何log信息的方法
- Linux的文件特殊权限
- 【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习
- 搭建linux远程服务器和传输下载文件
- Linux之/etc/fstab文件讲解
- Linux系统锁定关键文件
- Linux学习笔记(8)文件搜索与帮助(find)
- 【Linux FTP】(3)ftp-client自动上传文件
- Linux远程传输命令scp、rsync(tar打包归档并在系统之间传输文件)
- Linux中文件的分类