在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. 十三篇系列:king转折点,wooga瓶颈,supercell营收结构

    转自:http://gamerboom.com/archives/95125 十三篇系列:king的历史转折点,wooga的瓶颈,supercell的营收结构 第一篇 这句话In other word ...

  2. video兼容--可用

    兼容ie6,7,8,但是播放器会卡顿黑屏<!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  3. C# 自己动手实现Spy++(二)

    昨天已经实现了获取窗口的标题.句柄等信息,但是高亮部分还有问题,而且红色绘制框擦除也有问题,今天就又研究了下上述两个问题. 高亮部分红色框只显示左上的边框,而右下的显示不出来,如图: 代码如下: pu ...

  4. cas client

    (The client and server are the same thekeystore) cas client version: 3.5.1(cas-client-core-3.5.1) gi ...

  5. What Your Computer Does While You Wait.CPU的等待有多久?

    原文标题:What Your Computer Does While You Wait 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高 ...

  6. es6基础(7)--函数扩展

    { //有默认值的后面如果有参数必须要有默认值 function test(x,y="world"){ console.log(x,y) } test('hello');//hel ...

  7. python学习之----收集整个网站

    如果只是从一个页面跳到另一个页面,那么网络爬虫是非常无聊的.为了有效地使 用它们,在用爬虫的时候我们需要在页面上做些事情.让我们看看如何创建一个爬虫来收 集页面标题.正文的第一个段落,以及编辑页面的链 ...

  8. 微信小程序自定义微信客服按钮

    微信小程序官方api中提到的微信客服,是一个固定的组件,图标样式固定,大小最多27px 很明显这个是不能满足我们各种奇葩需求的.下面提供一个野蛮的自定义方法. 比如做一个这样的按钮: 图标用自定义的, ...

  9. ES6中新增字符串方法,字符串模板

    多了两个新方法 startsWith endsWith 返回的是一个Boolean值 let str='git://www.baidu.com/2123123'; if(str.startsWith( ...

  10. [PHP-DI] 理解依赖注入

    理解依赖注入 依赖注入 和 依赖注入容器 是不同的: 依赖注入 (Dependency injection) 是编写更好代码的一种方法 容器 (Container) 是帮助注入依赖关系的工具 你不需要 ...