导入:今天在centos 上安装protobuf(依赖perl, m4, autoconf,automake),安装automake过程中解压.tar.gz的时候提示设备空间不足,但df -h 显示还有磁盘空间;重启电脑之后发现很多软件无法打开,其中eclipse提示如下!

linux 无法打开iostream linux为什么打不开软件_数据

最后发现解压的时候提示磁盘空间不足 和 软件无法打开的原因为同一个: inode占用100%,删除掉一些无用的inode占用较大的文件之后解决。

通过查阅资料获取到以下相关知识点:

导语
        当你的 Linux 系统无法创建新文件时,有可能是你的磁盘满了,还有可能是你的磁盘的 inode 用光了,我们今天要说的就是后一种情况,要解决这个问题,只能是删除一些文件,但是一般情况下,其实是你的系统中的某个地方产生了大量的你并不需要的文件,你要做的就是找到他们并删除就可以了,我并不是让你删除你有用的文件,因为你一般不会有那么多有用的文件来把系统的 inode 用光。
什么是 inode ?
        文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
       操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。
       文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

       Inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是 Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。 inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。
       每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
       如何查看系统的 inode 占用情况: df -ih

问题解决(1):

情况描述:今天我们邮件服务器收发不了邮件了,而且连接到服务器上开启服务都开不了,起始以为磁盘空间不足,df 看了一下

linux 无法打开iostream linux为什么打不开软件_标准输出_02

发现空间是足够的,然后df -i 查看了下inodes,发现根目录下的inodes值使用率已经为100%了

linux 无法打开iostream linux为什么打不开软件_linux 无法打开iostream_03

通过以下脚本进行检查,查看到底哪个目录下面的文件最多:【亲测可用】

find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

最终发现/var/soppl目录最多。然后又进一步确定是/var/spool/amavisd/quarantine 目录下面有上百万个文件,机器已经无法正常显示了,后来百度查看了下这个目录是邮件服务器,处理垃圾邮件活病毒邮件隔离的,明白原因了,删除该目录下所有文件;使用xargs命令来删除数量比较多的文件:

ls | xargs -n 10 rm -rf

问题解决(2)

①大早上例行第一件事打开网站 然后就凉了

linux 无法打开iostream linux为什么打不开软件_数据_04

②刚开始以为是mysql的问题,于是我到tmp文件夹去看 ,发现里面有很多mysql产生的临时文件。
        这种临时产生的临时表是会自动清除的,为什么突然就报这种错呢?  仔细搜索是文件夹满了 写不进去文件了 。然后继续查看  df -h  

linux 无法打开iostream linux为什么打不开软件_linux 无法打开iostream_05

        还有20个G 怎么可能满了写不进文件,然后继续看 df -i,发现inode 节点 已经用完。

linux 无法打开iostream linux为什么打不开软件_linux 无法打开iostream_06

    ③什么是inode节点
       Inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是 Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。 inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。
       而这台服务器的Block虽然还有剩余,但inode已经用满,因此在创建新目录或文件时,系统提示磁盘空间不足。
       Inode的数量是有限制的,每个文件对应一个Inode。
       然后继续查看每个文件夹的的大小
       查看/var/spool/clientmqueue/ 的时候  9个G的文件
       怎么回事? 原来是系统中开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
所以千万要记住所有的定时任务 
       crontab里面的命令后面加上 > /dev/null 2>&1 或者crontab里面的命令后面加上 > /dev/nu

       先删除/var/spool/clientmqueue/ 里面所有的垃圾数据 然后在吧每个定时任务都指向空文件夹之后重启定时任务,监控文件夹是是否在产生文件。然后df -i 查看节点 一下子从100%降到7% 。

linux 无法打开iostream linux为什么打不开软件_linux 无法打开iostream_07

注:浅谈>/dev/null 2>&1

在crond计划任务、nohup中我们经常可以看到>/dev/null 2>&1,但是很多人并不理解其含义,想要真正的理解它,首先我们需要知道文件描述符的三种类型。

类型

文件描述符

重定向符号

位置

标准输入(stdin)

0

0<或0<<

/dev/stdin -> /proc/self/fd/0

标准输出(stdout)

1

1>或1>>

/dev/stdout -> /proc/self/fd/1

错误输出(stderr)

2

2>或2>>

/dev/stderr -> /proc/self/fd/2

标准输入重定向"0<"或"0<<"等同于"<"或"<<",我们在平时使用时一般都省略了"0"

标准输出重定向"1>"或"1>>"等同于">"或">>",我们在平时使用时一般都省略了“1”

通过上面的表格,我们将>/dev/null 2>&1拆开来看就容易理解的多
>/dev/null将标准输出重定向到空设备,即我们常说的“黑洞”
2>表示错误输出
&表示等同的意思
1标准输出
2>&1就表示错误输出重定向等同于标准输出
所以>/dev/null 2>&1就表示将标准输出及错误输出全部重定向到“黑洞”,这么做可以有效的防止结果输出到控制台,以及inode节点被写满。