在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(十七)-----释放 Linux 系统预留的硬盘空间 与Linux磁盘空间被未知资源耗尽 (转)

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

  5. Linux磁盘空间扩容(LVM)

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

  6. (转)Linux磁盘空间监控告警 && 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. C#语言正则用法

    string phone =""; string pattern @"|\d{10}"; bool rusurt = false; Console.WriteL ...

  2. pycharm中快捷键的使用

    转载自:https://blog.csdn.net/fighter_yy/article/details/40860949 Alt+Enter 自动添加包 shift+O 自动建议代码补全 Ctrl+ ...

  3. hdfs底层存储分隔符

    字段分割 \ map字段里面key \ value \ 每行结尾用linux换行符 \0a '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格,通常敲一个回车键,即是回车,又是换行( ...

  4. idea error:Command line is too long

    今天在正在本地运行的项目中写了一个无关项目的测试类,执行main函数时报错如下: 解决方案: 找到项目根目录下的.idea/workspace.xml,添加内容: <component name ...

  5. jmeter本机内存溢出如何修改?

    websocket连接过程中内存溢出,本机配置的内存最大和最小设置的512: 一.后台返回 二.结果树返回: Thread Name: 线程组 1-9Sample Start: 2017-09-11 ...

  6. vue build打包后css里的图片路径404不正确的问题

    vue build打包后css里的图片路径404 在vue-cli项目中build/utils.js中找到如下代码块,添加 publicPath:’../../’ if (options.extrac ...

  7. python之格式化输出(3种方式)

    python3.6后支持3种格式化输出方式,其中前两种为%-formatting及str.format ,第三种即为 f-string. 1.%-formatting 据传该格式化方法源于C.. &g ...

  8. concurrent.futures模块 -----进程池 ---线程池 ---回调

    concurrent.futures模块提供了高度封装的异步调用接口,它内部有关的两个池 ThreadPoolExecutor:线程池,提供异步调用,其基础就是老版的Pool ProcessPoolE ...

  9. 20165205 2017-2018-2 《Java程序设计》第五周学习总结

    20165205 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 学会内部类,匿名类,异常类的写法 牚握try...catch...finally处理异常的方 ...

  10. 《算法》第二章部分程序 part 4

    ▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...