Linux磁盘空间不足处理方法

时间:2021-10-19 20:16:12

在Linux环境上创建、拷贝文件或者vi编辑文件保存时经常会遇到系统提示"No space left on device"提示空间不足的问题。这种问题通常是由于磁盘空间不足或者inodes节点不足导致。解决办法也很简单就是删除不需要的文件进行磁盘空间或者inode节点释放。本文主要描述出现该问题时的分析方法和删除文件方法,包括:

(1)"No space left on device"问题分析,通过df -h查看是否磁盘空间不足,df -i查看是否inode节点不足。

(2)如何快速查找磁盘空间不足对应文件系统中的超大文件并进行删除。

(3)介绍使用find指令或者脚本快速删除无用文件。

问题现象

在创建文件或者vi编辑保存文件时linux系统提示"No space left on device"。

问题分析

出现"No space left on device"提示信息导致操作失败的原因通常有3种:

(1)文件系统中文件占用空间总量即将或超过100%。通过df -h可以查看是否有文件系统空间使用率快达到100%或已达到100%。

(2)文件已经删除但是存在占用文件的进程导致空间未释放。可以通过df和lsof指令查看。df查看文件系统空间充足,lsof查看存在已删除文件占用的进程。

(3)inodes节点不足导致。这种情况通常是系统上有非常多的单个文件占用空间很小但是数量很多导致。常见于linux服务器上安装有oracle数据库的场景。oracle数据库会生成很多的日志文件。

问题解决

(1)文件系统中文件占用空间总量即将或超过100%问题解决

Step1、利用df命令确定将磁盘空间即将耗尽的文件系统对应的目录。

linux~ # df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 % /
/dev/sda1 % /boot
tmpfs % /dev/shm
/dev/sdb1 % /home

根据上述结果可知,/dev/sdb1磁盘空间即将达到100%,对应的挂载点为/home目录。进入/home目录进行查找删除操作即可 。

Step2、利用du命令逐级查找占用磁盘空间较大的文件或者文件夹。

linux~ # du -sm /home

Step3、删除查找到的无用的安装包、备份包文件或者长期未清理的debug日志。如果查找确认之后发现并无占用较大空间的文件,需确认该文件系统挂载点/home目录下是否已被使用并且存在占用空间较大的文件。使用umout  /home卸载挂载点查看。具体查找删除文件方法可以查看FAQ。

Step4、重新执行df命令查看/dev/sdb1磁盘空间使用率是否降低。如果磁盘空间释放大小与已删除文件大小不一致,参考"df与du显示磁盘空间不一致问题解决"

2、df与du显示磁盘空间不一致问题解决

使用df命令查看文件系统空(/home)间不足,删除大文件后执行df重新查看,文件系统空间却并未增加。可能是删除文件时仍有进程在使用,删除时只是对删除文件做deleted标记并未真正释放。空间未释放。

分析解决方法如下:

Step1、du -sm /home查看对应文件系统文件占用大小。发现文件占用空间远远小于df查看占用的空间。

Step2、使用lsof指令查看被标记deleted但未真正释放的文件

linux~ # lsof /home | grep 'deleted'

或者

linux~ # ls -ald /proc/*/fd/* | grep 'deleted' | grep -v 'pts'

根据上述结果发现确实有进程占用刚删除的大文件。

Step3、kill掉占用删除文件的进程

linux~ # lsof /home | grep 'deleted' | grep -v grep | awk '{print $2}' | sort|xargs kill -

或者手工获取占用文件的进程ID,执行kill -9 ${ID}

Step4、重新执行df查看,问题解决。

3、df -i显示inodes使用率即将100%

Step1、df -i查看inodes使用率即将达到100%。获取对应的文件系统挂载目录。如/home

Step2、使用find命令查找文件,删除不需要使用的文件。通常为业务日志文件、oracle数据库日志文件、审计文件等等。大文件很少会出现这种情况,因为有大量大文件的话,首先应该是会把磁盘空间占满。具体查找删除文件方法可以参考FAQ。

Step3、删除文件,重新执行df -i查看,问题解决。

4、FAQs

  1、如何实现自动删除服务器垃圾文件?

需求描述

(1)假设业务运行产生的日志文件生成路径位于$HOME/log目录下,文件名为'用户名_[debug|run|warn].log'或者'用户名_[debug|run|warn].log.n',n为数字,常为备份名。

(2)假设业务运行产生的临时文件生成路径位于$HOME/temp目录,文件名为'用户名_[debug|run|warn].tmp'或者'用户名_[debug|run|warn].tmp.n',n为数字,常为备份名。

(3)查找Linux服务器超过指定大小(如100M)的安装包、备份包文件,供用户人工判断是否可以删除。

(4)不能误删系统文件,特别是oracle用户的重做日志文件(redoN.log)。

代码实现

#!/bin/bash

#********************************************************
#*** Author : lion
#*** Create Date : //
#*** Modify Date : NA
#*** Function : Delete the server logs and temp files
#******************************************************** function Usage()
{
echo "NAME"
echo " clearlogs.sh"
echo "SYNOPSIS"
echo " clearlogs.sh"
echo "DESCRIPTION"
echo " clear the server logs and temp files"
exit
} function writelog()
{
local logfile=$
local debug_level=$
local messages=$ echo "[$(date '+%Y-%m-%d %H:%M:%S')] [${debug_level}] ${messages}"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [${debug_level}] ${messages}" >> ${logfile}
} function find_logs()
{
local user=$
local user_home=$ if [ -d ${user_home}/log ];then
find ${user_home}/log -maxdepth -type f -name "${user}*.log*" -mtime +${KEEP_DAYS} -print >> "${DELETE_LOGS_LIST}"
fi if [ -d ${user_home}/temp ];then
find ${user_home}/temp -maxdepth -type f -name "${user}*.tmp*" -mtime +${KEEP_DAYS} -print >> "${DELETE_LOGS_LIST}"
fi
} if [ "X$1" == "X--help" ];then
Usage
fi if [ $(whoami) != 'root' ];then
printf "Please use root to execute\n"
exit
fi ##global Var
CURRENT_PATH=$(pwd)
CURRENT_DATE=$(date '+%Y%m%d')
SCRIPT_NAME="clearlogs"
CLEARLOGS_DIR="${CURRENT_PATH}/${SCRIPT_NAME}_${CURRENT_DATE}"
SEARCH_FILE_SIZE='100M'
LOG_FILE="${CLEARLOGS_DIR}/${SCRIPT_NAME}.log"
DELETE_LOGS_LIST="${CLEARLOGS_DIR}/${SCRIPT_NAME}_delete_files.log"
USER_LIST="${CLEARLOGS_DIR}/user.lst"
BIG_FILES_LIST="${CLEARLOGS_DIR}/${SCRIPT_NAME}_bigfile.lst"
KEEP_DAYS= if [ ! -d ${CLEARLOGS_DIR} ];then
mkdir ${CLEARLOGS_DIR}
fi rm "${DELETE_LOGS_LIST}" "${USER_LIST}" "${BIG_FILES_LIST}" &> /dev/null
touch "${DELETE_LOGS_LIST}" "${USER_LIST}" "${BIG_FILES_LIST}"
awk -F':' '{if($0 !~ /var/)print $1,$6}' /etc/passwd > "${USER_LIST}" writelog "${LOG_FILE}" "INFO" "Begin find logs and temp files,wait a moment....."
while read user user_home
do
find_logs ${user} ${user_home} &
done < "${USER_LIST}"
wait
writelog "${LOG_FILE}" "INFO" "End find logs and temp files" writelog "${LOG_FILE}" "INFO" "Begin delete logs and temp files at ${DELETE_LOGS_LIST}"
while read line
do
if [ -f ${line} ];then
rm ${line} &> /dev/null
if [ $? -eq ];then
writelog "${LOG_FILE}" "INFO" "File[ ${line} ] delete success"
else
writelog "${LOG_FILE}" "INFO" "File[ ${line} ] delete failed"
fi
fi
done < "${DELETE_LOGS_LIST}"
writelog "${LOG_FILE}" "INFO" "End delete logs and temp files at ${DELETE_LOGS_LIST}" writelog "${LOG_FILE}" "INFO" "Begin find larger than ${SEARCH_FILE_SIZE} files,wait a moment....."
find / \( -path '/proc' -o -path '/var' \) -prune -o -type f -size "+${SEARCH_FILE_SIZE}" -print > "${BIG_FILES_LIST}"
writelog "${LOG_FILE}" "INFO" "End find larger than ${SEARCH_FILE_SIZE} files"
writelog "${LOG_FILE}" "INFO" "The files at [ ${BIG_FILES_LIST} ] are larger than ${SEARCH_FILE_SIZE},please check and delete by manual"

使用方法

(1)上述代码已上传至github,下载路径:clearlogs.sh,上传到root用户目录下,任意目录。

(2)执行chmod +x clearlogs.sh赋可执行权限。

(3)执行./clearlogs.sh。查看相关日志即可。

说明:1、脚本可以根据实际情况进行修改以适用当前产品;2、脚本多次运行测试正常后可配置定时任务进行定期清理删除。

  2、Linux下如何快速查找占磁盘空间大的文件

需求背景

清理服务器文件系统空间时经常需要查找大文件以进行分析删除,从而释放空间。

设计思路

快速查找服务器上所有超过指定大小的文件并显示。第一列显示文件大小,第二列显示文件绝对路径。通常可以直接如下命令进行查找:

find / -type f -size +100M -print

考虑加快查找速度,分成多个目录在后台并发查找并显示。获取目录方法如下

find / -maxdepth 2 \( -path '/proc' -o -path '/var' \) -prune -o -type d -print | grep '^/.*/'

假设文件名为linux.tar.gz,第一列显示文件大小,第二列显示文件路径如下:

awk -v filename="linux.tar.gz" -v filesize=$(stat -c %s "linux.tar.gz" ) 'BEGIN{print filesize/1024/1024"M",filename}'

代码实现

#!/bin/bash

SEARCH_DIR_LIST="search_directory.txt"
SEARCH_TEMP_FILES="search_temp_files.txt"
SEARCH_FILES="search_files.txt"
file_size="100M" if [ $(whoami) != 'root' ];then
printf "Please Use root to execute\n"
exit
fi rm "${SEARCH_DIR_LIST}" "${SEARCH_TEMP_FILES}" "${SEARCH_FILES}" &> /dev/null
find / -maxdepth \( -path '/proc' -o -path '/var' \) -prune -o -type d -print | grep '^/.*/'> "${SEARCH_DIR_LIST}" printf "Begin search larger than ${file_size}M files,wait a moment....\n"
while read line
do
( find ${line} -type f -size +${file_size} -print >> "${SEARCH_TEMP_FILES}" ) &
done < "${SEARCH_DIR_LIST}"
wait
printf "End search larger than ${file_size}M files.\n" printf "Begin Compute each files detail size,please wait...\n"
while read line
do
awk -v filename=${line} -v filesize=$(stat -c %s ${line}) 'BEGIN{print filesize/1024/1024"M",filename}' >> ${SEARCH_FILES}
done < "${SEARCH_TEMP_FILES}"
wait
printf "End Compute each files detail size.\n" printf "Please Check below files..\n"
cat ${SEARCH_FILES} | sort -rn
rm "${SEARCH_DIR_LIST}" "${SEARCH_TEMP_FILES}"
printf "Script execute end!\n"

Linux磁盘空间不足处理方法的更多相关文章

  1. linux磁盘空间使用问题

    linux磁盘空间用满的处理方法 linux下空间满可能有两种情况 可以通过命令 df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) df -i  查看索引节点的占用(Inod ...

  2. 查看Linux磁盘空间大小命令

    发表于:2012-09-17 10:25   查看Linux磁盘空间大小 一.df 命令: df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文 ...

  3. Linux磁盘空间被未知资源耗尽【转】

    Linux磁盘空间被未知资源耗尽 在linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间, ...

  4. Linux学习之CentOS&lpar;十七&rpar;-----释放 Linux 系统预留的硬盘空间 与Linux磁盘空间被未知资源耗尽 &lpar;转&rpar;

    释放 Linux 系统预留的硬盘空间  大多数文件系统都会保留一部分空间留作紧急情况时用(比如硬盘空间满了),这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不致于马上就 crash,给监 ...

  5. Linux磁盘空间扩容&lpar;LVM&rpar;

    Linux磁盘空间扩容(lvm) 随着系统的运行时间增长,业务数据的增长,原有磁盘的空间会存在空间不足情况,导致系统不能正常运行,或者系统管理员磁盘没有完全划完,根据使用者的需求自行划分.那么怎么才能 ...

  6. &lpar;转&rpar;Linux磁盘空间监控告警 &amp&semi;&amp&semi; Linux磁盘管理

    Linux磁盘空间监控告警 http://blog.csdn.net/github_39069288/article/details/73478784-----------Linux磁盘管理 原文:h ...

  7. linux磁盘空间满了 但是没有大文件

    很常见的一个问题 linux磁盘空间满了 但是没有大文件 解决思路: 1.用df 检查发现/根目录可用空间为0 [root@/]#df -h 2.用du检查发现各目录占用的空间都很少,有约3G的空间莫 ...

  8. Linux磁盘空间不足

    Linux磁盘空间不足 描述:zabbix报警磁盘空间不足 1.登录服务器,查看磁盘空间 2.筛选空间占用的文件 层层筛选 3.将没用的文件删除 rm -f /opt/export/log/np_se ...

  9. linux磁盘空间满的处理

    Java中运行SQL插入数据时报错: linux磁盘空间满处理: 1.df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) 2.分别查看输入以下命令 (面对磁盘满了,通过下列命令 ...

随机推荐

  1. mybatis高级&lpar;3&rpar;&lowbar;延迟加载&lowbar;深度延迟&lowbar;一级缓存&lowbar;二级缓存

    设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --> <settings ...

  2. MacBook Pro&sol;Air 下使用 linux ubuntu 系统 波浪号&OpenCurlyDoubleQuote;~”变成其他 符号 的完美解决办法

    打开终端,输入: sudo su - > /sys/module/hid_apple/parameters/iso_layout sudo su -需要root权限,所以使用前请注意已下载roo ...

  3. &lpar;笔记&rpar;Linux内核学习&lpar;八&rpar;之定时器和时间管理

    一 内核中的时间观念 内核在硬件的帮助下计算和管理时间.硬件为内核提供一个系统定时器用以计算流逝的时间.系 统定时器以某种频率自行触发,产生时钟中断,进入内核时钟中断处理程序中进行处理. 墙上时间和系 ...

  4. 关于linux上pdf阅读器

    今天也是倒腾linux 上pdf阅读器好久. 1.okular是挺好的,但是却太大了,好多功能,我没有细看.我简单的打开了几个pdf文件,发现加载速度还是太慢了.所以基于种种,我给卸载掉了. 安装直接 ...

  5. ListView的小知识

    1.设置项目分割功能 android:divider="@android:color/blue" android:dividerHeight="10dp" &l ...

  6. 内存与IO的交换【转】

    用户进程的内存页分为两种: file-backed pages(文件背景页) anonymous pages(匿名页) 比如进程的代码段.映射的文件都是file-backed,而进程的堆.栈都是不与文 ...

  7. Python函数的作用域规则和闭包

    作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器 ...

  8. &lbrack;Java学习&rsqb;面向对象-super关键字;final关键字

    super关键字 super代表的是当前子类对象中的父类型特征,可以看做是this的一部分.与this不同,不是引用,不存储对象内存地址. super可以用在什么位置 1 可以用在成员方法中.不能用在 ...

  9. centos7 开启特定的端口

    systemctl是centos7的服务管理工具中主要的工具,它融合之前的service和chkconfig功能于一体; 开机时启动:systemctl enable firewalld.servic ...

  10. Phalcon Framework的MVC结构及启动流程分析

    目前的项目中选择了Phalcon Framework作为未来一段时间的核心框架.技术选型的原因会单开一篇Blog另说,本次优先对Phalcon的MVC架构与启动流程进行分析说明,如有遗漏还望指出. P ...