最近项目组人员反馈一个问题:即磁盘空间满了,但是并没看到有什么文件占用空间:

[root@xxxx home]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 40G 6.4G 31G 18% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/xvda1 190M 46M 135M 26% /boot
/dev/xvda3 40G 39G 0G 100% /home
/dev/xvda5 40G 49M 38G 1% /tmp
[root@xxxx home]# pwd
/home
[root@xxxx home]# du -sh
5.4G .
[root@IHSwaiwang7 home]# ls -a
. .. appuser ftp_dir linux lost+found

  

为什么磁盘空间大小显示不准确呢?
有隐藏文件?还是其他原因?
du -sh 命令统计了整体的空间使用率,隐藏文件也能被统计进去。
ls -lah 也没看到有问题的文件

然后想到是不是有些文件被删除,但是资源并未释放呢?
在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被
打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。

查看被打开的已删除文件:

[root@xxxx home]# lsof -n | grep deleted
java root 1w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 42w REG , /home/appuser/tomcat7-MIR-/logs/localhost_access_log.--.txt (deleted)
java root 8w REG , /home/appuser/tomcat7-IMR-/logs/localhost.--.log (deleted)
java root 7w REG , /home/appuser/tomcat7-MIR-/logs/catalina.--.log (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 1w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)

果然存在未释放资源。一个占用了25981280125 大约24G,一个占用了 12643031059 大约12G,这不就是占满了嘛!而且都是catalina.out 日志文件

验证该文件是否存在:

[root@xxxx ~]# ll /home/appuser/tomcat7-MIR-/logs/catalina.out
-rw-r--r-- root root 4月 : /home/appuser/tomcat7-MIR-/logs/catalina.out

文件居然存在的,但是没那么大啊。

再看其他文件:

[root@xxxx ~]# ll /home/appuser/tomcat7-SI-/logs/catalina.out
ls: 无法访问/home/appuser/tomcat7-SI-/logs/catalina.out: 没有那个文件或目录

这个文件倒是真的不存在。

那么能通过创建文件的方式解决吗?

[root@xxxx ~]# > /home/appuser/tomcat7-SI-/logs/catalina.out
[root@xxxx ~]# ll /home/appuser/tomcat7-SI-/logs/catalina.out
-rw-r--r-- root root 4月 : /home/appuser/tomcat7-SI-/logs/catalina.out
[root@xxxx ~]# lsof -n | grep deleted
java root 1w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 42w REG , /home/appuser/tomcat7-MIR-/logs/localhost_access_log.--.txt (deleted)
java root 8w REG , /home/appuser/tomcat7-IMR-/logs/localhost.--.log (deleted)
java root 7w REG , /home/appuser/tomcat7-MIR-/logs/catalina.--.log (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 1w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted))

创建文件并不能释放资源。

清空文件呢?

[root@xxxx ~]# > /home/appuser/tomcat7-MIR-/logs/catalina.out
[root@xxxx ~]# ll /home/appuser/tomcat7-MIR-/logs/catalina.out
-rw-r--r-- root root 4月 : /home/appuser/tomcat7-MIR-/logs/catalina.out
[root@xxxx ~]# lsof -n | grep deleted
java root 1w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 42w REG , /home/appuser/tomcat7-MIR-/logs/localhost_access_log.--.txt (deleted)
java root 8w REG , /home/appuser/tomcat7-IMR-/logs/localhost.--.log (deleted)
java root 7w REG , /home/appuser/tomcat7-MIR-/logs/catalina.--.log (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 1w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted))

清空文件也不能释放资源。

正常来说直接把进程杀了,资源立刻就能被释放。但是这是生产环境,问了开发人员进程不能杀,那怎么办呢?
最彻底的方法当然就是重启进程,杀进程或重启服务器。但是不能杀的情况下,怎么释放资源呢?

当linux打开一个文件的时候,Linux内核会为每一个进程在/proc 目录下创建建立一个以其pid
为名的目录用来保存进程的相关信息,而其子目录fd保存的是该进程打开的所有文件的fd(fd:file descriptor)。
目录格式类似/proc/27319/fd

那么我们进到目录下,看有哪些文件被占用:

[root@xxxx fd]# cd /proc//fd
[root@xxxx fd]# ls [root@xxxx fd]# ll | grep deleted
l-wx------ root root 4月 : -> /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
l-wx------ root root 4月 : -> /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
l-wx------ root root 4月 : -> /home/appuser/tomcat7-MIR-/logs/localhost_access_log.--.txt (deleted)
l-wx------ root root 4月 : -> /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)

果然文件都是以链接的形式存在的,那么我们查看文件

/home/appuser/tomcat7-MIR-20012/logs/catalina.out
就相当于读取的这里的文件 1 

文件1能直接查看吗?

[root@xxxx fd]# more
-- :: [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能组:3600上没有空闲的坐席!
-- :: [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 开始分配任务,队列: 任务数: 空闲坐席:
[root@xxxx fd]# tail
-- :: [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 开始分配任务,队列: 任务数: 空闲坐席:
-- :: [cn.sh.xxx.mir.local.rule.allocation.impl.AbstractAllocationRule]-[INFO] 获取租户514000技能队列3600上签入的坐席数据!
-- :: [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能组:3600上没有空闲的坐席!
-- :: [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 开始分配任务,队列: 任务数: 空闲坐席:
-- :: [cn.sh.xxx.mir.local.rule.allocation.impl.AbstractAllocationRule]-[INFO] 获取租户514000技能队列3650上签入的坐席数据!
-- :: [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能组:3650上没有空闲的坐席!
-- :: [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 开始分配任务,队列: 任务数: 空闲坐席:
-- :: [cn.sh.xxx.mir.local.rule.allocation.impl.AbstractAllocationRule]-[INFO] 获取租户514000技能队列3490上签入的坐席数据!
-- :: [cn.sh.xxx.mir.local.rule.allocation.impl.DefautAllocationRule]-[INFO] 技能组:3490上没有空闲的坐席!
-- :: [cn.sh.xxx.mir.local.executor.AllocationTask]-[INFO] 开始分配任务,队列: 任务数: 空闲坐席:

果然能直接查看,而且保留了2016年的日志,怪不得这么大。而且仍在往里面写日志。
再检查我们刚才创建的文件,日志并没写进去。

既然如此,那我们把这个日志文件清理了,空间时不时就降下来了?

[root@xxxx fd]# >
[root@xxxx ]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 40G .4G 31G % /
tmpfs .8G .8G % /dev/shm
/dev/xvda1 190M 46M 135M % /boot
/dev/xvda3 40G 15G 23G % /home
/dev/xvda5 40G 49M 38G % /tmp

空间顺利释放,同样办法我们把另一个日志也清理掉。

java             root    1w      REG              ,       /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)

[root@xxxx ]# cd /proc//fd
[root@xxxx fd]# ls -l | grep deleted
l-wx------ root root 4月 : -> /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)
l-wx------ root root 4月 : -> /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)
[root@xxxx fd]# >
[root@xxxx fd]# lsof -n | grep deleted
java root 1w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-MIR-/logs/catalina.out (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 42w REG , /home/appuser/tomcat7-MIR-/logs/localhost_access_log.--.txt (deleted)
java root 8w REG , /home/appuser/tomcat7-IMR-/logs/localhost.--.log (deleted)
java root 7w REG , /home/appuser/tomcat7-MIR-/logs/catalina.--.log (deleted)
java root 8w REG , /home/appuser/tomcat7-MIR-/logs/localhost.--.log (deleted)
java root 1w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)
java root 2w REG , /home/appuser/tomcat7-SI-/logs/catalina.out (deleted)
[root@xxxx fd]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 40G .4G 31G % /
tmpfs .8G .8G % /dev/shm
/dev/xvda1 190M 46M 135M % /boot
/dev/xvda3 40G .5G 35G % /home
/dev/xvda5 40G 49M 38G % /tmp

完成!

通过以上方法,在不杀进程的情况下,顺利释放了磁盘空间。但这只是一个临时的处理方式。
该文件不释放仍会持续增长下去。
仍然需要项目组预约一个维护窗口,把所有进程都杀掉,彻底释放资源才算彻底解决。

参考:

https://www.cnblogs.com/xxdfly/p/6564294.html

https://blog.csdn.net/wyzxg/article/details/4971843

Linux 不杀进程的情况下,如何释放磁盘资源的更多相关文章

  1. MySQL删除数据几种情况以及是否释放磁盘空间【转】

    MySQL删除数据几种情况以及是否释放磁盘空间: 1.drop table table_name 立刻释放磁盘空间 ,不管是 Innodb和MyISAM ; 2.truncate table tabl ...

  2. Linux开启SELinux的情况下怎么解决nginx403跟502错误

    https://www.cnblogs.com/caijt/p/10978324.html 以上篇博客中说了怎么在linux部署asp.net core  跟 nginx,里面成功的前提是把SElin ...

  3. Linux不重启的情况下添加硬盘

    众所周知,SATA和SCSI是支持热插拔的,但是新装了这类支持热插拔的驱动器,系统不会马上识别的,往往我们需要重启系统来识别,但是有另外一种方法可以很方面的让系统识别新的设备.作为系统管理员,需要了解 ...

  4. Kali Linux ——在无网络情况下安装无线网卡驱动

    1.背景: 今日刚刚开始学习kali linux,众所周知,安装完成后,系统是没有无线网卡驱动的,这就对学生党造成相当的困扰:校园网要连接有线是需要认证客户端的,而认证客户端只有windows端,如此 ...

  5. linux 无外网情况下安装 mysql

    由于工作需要,需要在一台装有 CentOS 系统的测试服务器上安装 MySQL ,由于该服务器上存有其他比较重要的测试数据,所以不能连接外网.由于之前安装 MySQL 一直都是使用 yum 命令一键搞 ...

  6. Linux查看端口占用情况,并强制释放占用的端口

    1.查找被占用的端口 netstat -tln netstat -tln | grep 8080 netstat -tln 查看端口使用情况,而netstat -tln | grep 8080则是只查 ...

  7. linux在不关机情况下新增硬盘的方法

    开机状态插入硬盘 不关机执行命令 echo "- - -" > /sys/class/scsi_host/host0/scan 注意 echo "- - -&quo ...

  8. linux服务器没网情况下手动安装软件几个方法

    1,找到一个有网的服务器,使用yumdownloader gcc,获取需要的rmp包: 2,在http://pkgs.org 下下载所需要的rpm包

  9. Linux在丢失的情况下重置密码

    1.开机菜单是 移动光标到第一行 --敲击e 2.找到UTF-8,加上空格rd.break,敲击ctrl+x 3.输入以下命令 mount -o remount,rw /sysroot chroot ...

随机推荐

  1. drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法二

    drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法一 中介绍了ckeditor的安装和配置方法,其实还有另一种新方法,不用IMCE模块. 不过需要ckfinder的JS库,可以 ...

  2. Java 之集合框架 中(10)

    Map和HashMap Map接口: Map 提供了一种映射关系,其中的元素是以键值对(Key-Value)的形式 存储的,能够实现根据Key快速查找value Map中的键值对以Entry类型的对象 ...

  3. Windows 批处理(cmd/bat)常用命令教程

    Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题: 1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat 文件中输出中文乱码 解决方法在文章末尾! ...

  4. Python爬虫教程-10-UserAgent和常见浏览器UA值

    Python爬虫教程-10-UserAgent和常见浏览器UA值 有时候使用爬虫会被网站封了IP,所以需要去模拟浏览器,隐藏用户身份, UserAgent 包含浏览器信息,用户身份,设备系统信息 Us ...

  5. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/JJ]]

    1. 如果webapps下有同名的文件,会出现以上错误: 2.解决办法: 查看项目的目录结构是否正确,对于servlet项目,WEB-INF下应该有一个classes目录,存放编译好的.class文件 ...

  6. Ubuntu桌面显示超大,现在显示不全

    按住alt可以自由拖动窗口或者滚动鼠标滚动轮,整体放大缩小桌面把窗口拖动到显示设置然后调整菜单和标题栏缩放比例

  7. Apache的配置详解

    Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改. 主站点的配置(基本配置) (1) 基本配置: ServerRoot "/mnt/s ...

  8. 请问在JAVA编程中什么叫耦合?什么又叫解藕? 悬赏分:0 - 解决时间:2008-3-8 12:55

    模块一的实现依赖于模块二,更改模块二后,模块一也得更改,那么二者就有耦合.修改程序,使得更改模块二后,模块一不受影响,那么就叫解藕 请问<java编程思想>中的“完全解藕”如何理解,和实现 ...

  9. Oracle的四种连接方式【转载】

    我们以Oracle自带的表来做例子 主要两张表:dept.emp 一个是部门,一个是员工表结构如下: emp name null? Type Empno not null number(4) enam ...

  10. Linux中安装Nginx

    1.安装编译文件及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel 2.安装PCRE,Ngi ...