16年专业服务器托管租用服务商!
咨询热线 : 400-880-5868

首页 > 客服中心 > 帮助中心

帮助中心

服务器磁盘不足,1分钟快速搞定!

发布时间:2019-11-26 13:27:53    返回首页

  背景
  对于系统服务器,一般由技术同学自行控制以及管理,但是针对服务器的监控以及告警比较容易被人忽视。所以经常会导致服务器上出现各种各样的问题。最常见的问题,就是磁盘空间被服务日志给打满了。  
  当服务器上磁盘已经被打满,服务无法正常运行时,需要做的第一个工作就是去找到没用的日志文件,进行清空或者删除操作。  
  一、先看是不是
  那当我们遇到类似的情况,比如访问无反应,服务器上没有日志了。第一步要做的,不是去想怎么处理,而是先确认是不是磁盘问题引起的。命令很简单df -h     
  先看看我们对应的目录磁盘使用率,是否有富余。如果磁盘还有空间,那我们就要从其他角度去检查服务的健康情况了。  
  二、再看为什么
  当我们发现具体目录的使用率很高的时候,就可以进入到对应的目录里去使用下一个工具。du -s *查看当前目录所有文件夹占用的磁盘空间,此时占用磁盘空间数值的单位是K。如果想更直观些,可以使用du -sh *,此时单位根据大小可以自动展示成K、M、G等单位。  
  当然也可以跟上排序,推荐使用du -s * | sort -nr | more。如果使用du -sh * | sort -nr最终的排序,并不是空间从大到小,而是数值较大的会排在前面,比如500M会排在2G之前,因为500比2要大。通过上面的方法,可以快速定位到占用空间较大的文件夹,就可以一层一层去找到占用磁盘空间较大的文件了。      
  三、解决方案
  定位到大文件后,最简单的,大家想到的都是直接rm -f 文件名。针对于历史的日志文件。如果日志没有用了,当然可以用此种方案去处理,有一种情况,使用rm -f 文件名 是没有作用的。那就是删除的目标文件,当前是正在使用的状态下,比如某个tomcat正在往这个日志里面输出内容,如果我们直接删除此文件,文件虽然看不到了,但是磁盘空间并不会被释放。  
  有几种方案可以处理当前遇到的问题。1.利用/dev/null设备来清空文件,e.g. cat /dev/null > filename,cp /dev/null > filename。2.把一个不存在的内容重定向到文件中,e.g. > filename。3.输出空字符串到文件中,e.g. echo “” > filename。4. 利用“true”命令,e.g. true > filename,: > filename。5. 使用truncate命令来清空文件,e.g. -s 0 filename。  
  四、长期解决方案
  每当服务器磁盘出问题时,都可以通过上述的几个步骤去搞定磁盘问题。但是,如果此类问题经常出现,我们就需要不断重复上述的步骤,还是比较麻烦的,而且我们会发现,经常出问题的日志文件是在固定的几个目录下。这时候我们可以利用linux自带的crontab来执行一些固定的脚本来处理这些不断积累的日志文件。
  针对历史没用的日志文件,我们可以每天定时去删除几天之前的日志。参考命令如下:
  00 02 * * * /usr/bin/find /opt/log/* -type f -mtime +3 -exec rm {} \;  
  解释一下,crontab的时间设置,每天凌晨2点执行一次。可以根据自己负责的服务器情况,避免跟一些复杂的任务产生冲突。然后使用find命令找到日志目录下的所有日志文件。-mtime +3指距离当前时间96小时之前的所有文件。96/24=4天?为什么是+3呢,这个-mtime的参数,值得去深入理解一下。  
  -mtime 0 指过去24小时内被修改过的文件。
  -mtime 1 指过去48小时至24小时内被修改过的文件。
  -mtime 2 指过去72小时至48小时内被修改过的文件。
  -mtime 3 指过去96小时至72小时内被修改过的文件。  
  可以看出来,后面的数字代表的意思是从当前时刻往前数,(N*24+24)小时至(N*24)小时内的所有被修改过的文件。那么当-mtime后面的参数带上“+”或者“-”的时候呢。也比较好理解,+就是在这个N的范围之前所有时间,-就是在N的范围之后所有的时间。继续举例子。  
  -mtime -0 指当前时间之前被修改过的文件(这不就是未来被修改过的文件吗?),其实大家可以在服务器上试一下,如果当前一个日志文件一直有内容输出,也是可以把这个文件找出来的,所以-mtime -0可以理解为此刻正在被修改的文件。
  -mtime +0 就比较好理解了。就是在24小时之前被修改过的文件。
  -mtime -1 指24小时之内被修改过的文件,与-mtime 0的效果一致。
  -mtime +1 指48小时之前被修改过的文件。
  -mtime -2 指过去48小时之内被修改过的文件。
  -mtime +2 指过去72小时之前被修改过的文件。
  -mtime -3 指过去72小时之内被修改过的文件。
  -mtime +3 指过去96小时之前被修改过的文件。
  到此,可以说明清楚,+3为什么不是3天(72小时)之前被修改过的所有文件,而是4天(96小时)之前被修改过的所有文件。      
  处理几天前的日志文件,可以使用上面的定时任务,假设有一个服务的日志量特别大,一天或者几个小时之内就会把剩余的磁盘空间打满。这个时候我们可以怎么处理呢。按照文章上面的说法,直接删除日志文件是不可取的,如果涉及的服务并没有关闭或者重启,日志文件占用的磁盘空间并不会释放。这时候,就可以使用另外几种清空文件内容的命令了。参考命令如下:  
  0 */1 * * * /usr/bin/find /opt/log -type f -size +1G -exec cp /dev/null {} \;  
  类似之前的定时任务,执行频率调高,每一个小时执行一次,我们先要找到日志文件,多一个控制参数,就是找到内容超过1G的文件,只有特别大的文件,才是我们需要处理的目标。再去执行一个文件清空的命令,比如这边选择的是cp /dev/null filename。这样我们就可以做到,每小时去清空内容过多的日志文件。也不需要我们重启服务耽误其他测试工作。  
  总结
  总结一下,发现服务器不可用的时候,可以先确认是否为磁盘问题(df命令),然后找到占用磁盘较多的文件(du),删除(rm)旧的或者清空(cat /dev/null)正在使用的日志文件。可以临时解决一次问题,如果经常出现类似的情况,我们就可以使用crontab来定时处理日志文件了。当然,针对线上的服务器,日志的备份还是比较重要的。千万不要图省事,参考本文的方式去处理。

在线咨询
QQ 咨询
服务热线
扫一扫

扫一扫
关注我们

全国免费服务热线
400-880-5868

返回顶部