system分区就是运行内存分区么 system分区满了会怎么样_linux文件句柄满了 现象


文件系统满(file system full),几乎是每个程序员都会遇到的问题。它会导致各种神奇的现象,比如程序突然无法启动、日志突然不刷新了等。测试环境,我们通常找出大文件并删除即可。常规的步骤是:确认文件系统使用率、找出大文件(目录)、清理。

另外,某些极端情况,即便删除了大文件,也会发现文件系统空间未释放。

查看文件系统利用率

df命令(即disk free的简称),用于报告文件系统的使用量。我们通过df命令,先看初步定位一下是否有利用率(Use%)为100%或可用量(Avail)几乎为0的的文件系统。如果存在,则需要注意。

如果只看某个文件或目录所在的文件系统,则可以跟上路径名,比如df /home/maoshuai只会报告/home/maoshuai所在的文件系统的情况。

找出大文件(目录)

找出满的文件系统,下一步是确定哪些文件最占空间,这样清理起来更有效率。找出大文件可以通过du命令完成(disk usage的简称)。

du命令默认是递归输出所有子目录的大小,如果子目录很多层,会让人眼花缭乱,并不实用,倒是du -sh *更为实用。其中-h 代表用human readable的格式显示空间大小单位,而-s即summarize,即仅输出总大小,所有du -sh *代表输出当前目录各子目录或文件的大小。

递归的使用du -sh *查看,直到找出需要删除的大文件。

删除

删除就很容易了,直接rm或使用find命令根据条件rm。

删除后空间不释放

上述3个步骤,基本可以处理文件系统满的问题,但某些特殊情况,会出现删除后空间不释放的问题。更诡异的是明明在文件系统根目录使用du -sh .查看总使用大小,竟然和df -h显示的使用大小不一致。这很可能是出现了某个进程占用了该文件。在这种情况下,即便删除了文件,文件系统也不会释放。

具体验证的方法就是使用lsof | grep "(deleted)",查看是否存在你删除的文件,并查看其进程ID,根据进程ID找到对应进程,尝试重启该进程。

出现这种诡异的现象,是因为Linux下文件系统使用inode进行管理。对进程来说,对文件的引用并不是通过路径名实现,所有的路径名都要转换成一个inode的结点id,路径名只不过是提供给“用户”的概念。 正式基于此,Linux下竟然可以在进程使用的时候,对占用的文件进行重命名甚至删除操作。因为,进程根本不关心路径名!

总结

  1. 使用df确定是否存在文件系统满。
  2. 使用du -sh * 逐级搜索大文件或目录
  3. 使用rm -rf 删除。
  4. 如果发现文件删除后,df没有明显的看到文件系统释放,使用lsof | grep "(deleted)"查看是否存在删除的文件仍然被某个进程使用。