linux下删除文件后没有释放空间


今天发现一台服务器的home 空间满了,于是要清空无用的文件,当我删除文件后,发现可用空间没有变化


OS centos4.7


现象:


发现当前磁盘空间使用情况:


[根@ ticketb~]#df-h来
文件系统容量已用可用已用%挂载点
/ dev/sda1的9.81亿英镑203M 729M 22%/
无16G 16G 0 0%的/ dev / shm的
/ dev/sda9 2.9G 37M 2.7G 2%/ tmp目录
/ dev/sda7 4.9G 1.9G 2.7G 42%的/ usr
/ dev/sda8 2.9G 145M 2.6G 6%的/ var
的/ dev / mapper /下vghome-lvhome
                      20G 19G 11M 100%/家庭
/ dev/mapper/vgoradata- lvoradata
                     144G 48G 90G 35%/ u01/oradata
为/ dev / mapper /下vgbackup-lvbackup
                     193G 7.8G 175G 5%/ u01/backup


通过下面的命令找到无用的文件,然后删除


[根@ ticketb~]#查找/主页/甲骨文/管理/ dbticb / UDUMP /名称“dbticb_ * TRC。” - 的mtime +50 | xargs的RM-RF


然后在查看磁盘空间使用情况,发现没有/家居空间没有变化


[根@ ticketb~]#df-h来
文件系统容量已用可用已用%挂载点
/ dev/sda1的9.81亿英镑203M 729M 22%/
无16G 16G 0 0%的/ dev / shm的
/ dev/sda9 2.9G 37M 2.7G 2%/ tmp目录
/ dev/sda7 4.9G 1.9G 2.7G 42%的/ usr
/ dev/sda8 2.9G 145M 2.6G 6%的/ var
的/ dev / mapper /下vghome-lvhome
                      20G 19G 11M 100%/家庭
/ dev/mapper/vgoradata- lvoradata
                     144G 48G 90G 35%/ u01/oradata
为/ dev / mapper /下vgbackup-lvbackup
                     193G 7.8G 175G 5%/ u01/backup


这个郁闷啊,明明删除文件了,怎么空间没有被释放啊,rm 命令应该是直接删除啊,在查看下/home 下还有什么占用空间


[根@ ticketb~]#DU-H -最大深度= 1 /家居
16K /家/的lost + found
2.6G /家用/ oracle的
2.6G /家


可这里显示空间已经释放了啊,于是谷歌下,


未释放磁盘空间原因:


Linux 或者Unix 系统中,通过rm 或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink). 然而如果文件是被
打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。而我删除的是oracle 的告警log 文件
删除的时候文件应该正在被使用


解决方法


首先获得一个已经被删除但是仍然被应用程序占用的文件列表,如下所示:


[根@ ticketb~]#lsof的| grep的删除
oracle的12639 oracle的5瓦特REG 253,0 648 215907 / home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc(删除)
甲骨文12639 oracle的6瓦特REG 253,0 16749822091 215748 /家/ ORACLE /管理/ dbticb / bdump / alert_dbticb.log(删除)
甲骨文12639 oracle的7U REG 253,0 0 36282 / home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb(删除)
甲骨文12639 oracle的8瓦特REG 253,0 16749822091 215748 /家居/ ORACLE /管理/ dbticb / bdump / alert_dbticb.log(删除)
甲骨文12641 oracle的5瓦特REG 253,0 648 215907 / home/oracle/admin/dbticb/udump/dbticb_ora_12637.trc(删除)
oracle的12641 oracle的6瓦特REG 253,0 16749822091 215748 /家居/ ORACLE /管理/ dbticb / bdump / alert_dbticb.log(删除)



甲骨文23492 oracle的6瓦特REG 253,0 16749822091 215748 /家居/ ORACLE /管理/ dbticb / bdump / alert_dbticb.log(删除)
甲骨文23492 oracle的7U REG 253,0 0 36282 / home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstdbticb(删除)
甲骨文23492 oracle的8瓦特REG 253,0 16749822091 215748 /家/ ORACLE /管理/ dbticb / bdump / alert_dbticb.log(删除)
甲骨文23494 oracle的10U REG 253,0 0 36307 / home/oracle/oracle/product/10.2.0/db_1/dbs/lkinstrmandb(删除)



从输出结果可以看到/home/oracle/admin/dbticb/bdump/alert_dbticb.log 还被使用,未被释放空间


如何让进程释放呢?


一种方法是kill 掉相应的进程,或者停掉使用这个文件的应用,让os 自动回收磁盘空间

我这个环境有很多进程在使用的这个文件,停掉进程有点麻烦,再有就是风险很大


linux 打开一个文件的时候,Linux 内核会为每一个进程在/proc/  /proc/nnnn/fd/ 目录(nnnn pid )』建立一个以其pid
为名的目录用来保存进程的相关信息,而其子目录fd 保存的是该进程打开的所有文件的fd fd file描述符)。

kill 进程是通过截断proc 文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。
这是一项高级技术,仅到管理员确定不会对运行中的进程造成影响时使用。应用程序对这种方
式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题


所以我还是采用停应用来解决


重启oracle的数据库,发现的/ home / oracle的/管理/ dbticb / bdump / alert_dbticb.log 对应的空间被释放


在查看磁盘空间的使用情况,发现空间已经回收了


[根@ ticketb~]#df-h来
文件系统容量已用可用已用%挂载点
/ dev/sda1的9.81亿英镑203M 729M 22%/
无16G 16G 0 0%的/ dev / shm的
/ dev/sda9 2.9G 37M 2.7G 2%/ tmp目录
/ dev/sda7 4.9G 1.9G 2.7G 42%的/ usr
/ dev/sda8 2.9G 145M 2.6G 6%的/ var
的/ dev / mapper /下vghome-lvhome
                      20G 16G 2.6G 15%/家
的/ dev / mapper /下vgoradata - lvoradata
                     144G 48G 90G 35%/ u01/oradata
为/ dev / mapper /下vgbackup-lvbackup
                     193G 7.8G 175G 5%/ u01/backup


OK
,问题解决,然后做下收尾工作即可


-------------------------------------------------- -----------------------------------------------


学习下lsof的命令


lsof的全名打开的列表files ,也就是列举系统中已经被打开的文件。我们都知道,linux 环境中,任何事物都是文件,
设备是文件,目录是文件,甚至sockets 也是文件。所以,用好lsof 命令,对日常的linux 管理非常有帮助。


lsof的linux下最常用的命令之一,通常的输出格式为:


引用
COMMAND PID USER FD型器件尺寸的节点名称


常见包括如下几个字段:更多的可见说明书

1 COMMAND
默认以9 个字符长度显示的命令名称。可使用+c 参数指定显示的宽度,若+c 后跟的参数为零,则显示命令的全名
2
PID :进程的ID
3
PPID
父进程的IP 号,默认不显示,当使用-R 参数可打开。
4
PGID
进程组的ID 编号,默认也不会显示,当使用-g 参数时可打开。
5
USER
命令的执行UID 或系统中登陆的用户名称。默认显示为用户名,当使用-l 参数时,可显示UID
6
FD
是文件的File描述符的数量,或者如下的内容:
(这里很难翻译对应的意思,保留英文)


引用
CWD当前的工作目录;
LNN库引用(AIX);
JLD监狱目录(FreeBSD的);
LTX共享库文本(代码和数据);
。MXX十六进制内存映射型号码xx
M86 DOS合并映射文件;
MEM内存映射文件;
mmap的内存映射设备;
PD父目录;
RTD根目录;
TR内核跟踪文件(OpenBSD的);
TXT文本的程序(代码和数据);
8086 VP /九映射文件;



文件的文件描述符数显示模式有:


引用
R表示读访问;
w代表写访问;
u代表读写访问;
N代表未知类型的的Solaris NFS锁;
r代表对文件的一部分读锁,
R表示整个文件的读锁;
w代表对文件的一部分的写锁,
W为整个文件的写锁,
U代表一个读写任意长度的锁;
U表示未知类型的锁,
x表示该文件的一部分在SCO OpenServer Xenix的锁,
X,支持整个文件上的SCO OpenServer Xenix的锁;
空间,如果没有锁。



7 TYPE

引用
的IPv4 IPv4
的包;
IPv6  
使用IPv6 格式的包,即使地址是IPv4 的,也会显示为IPv6 ,而映射到IPv6 的地址;
DIR  
目录
LINK  
链接文件

详情请看说明书中更多的注释。


8 设备
使用特殊字符块special 表示的设备号
9
SIZE
文件的大小,如果不能用大小表示的,会留空。使用-s 参数控制。
10
NODE
本地文件的node 码,或者协议,如TCP
11
NAME
挂载点和文件的全路径(链接会被解析为实际路径),或者连接双方的地址和端口、状态等


常用示例:


1,显示开启文件/ home/oracle/10.2.0/db_1/bin/tnslsnr 的进程


[根@ SVR-DB-测试~]#lsof的/ home/oracle/10.2.0/db_1/bin/tnslsnr
COMMAND PID USER FD型器件尺寸的节点名称
TNSLSNR 3520甲骨文TXT REG 253,5 431062 11408866 /家居/ ORACLE / 10.2.0/db_1/bin/tnslsnr


2,知道22 端口现在运行什么程序


[根@ SVR-DB-测试~]#lsof的-I:22
COMMAND PID USER FD型器件尺寸的节点名称
sshd的3101根3U IPv6的8670 TCP *:SSH(LISTEN)
sshd的4545根3U的IPv6 4237972 TCP 203.aibo.com :SSH->双赢avbmq9e8ka7.gdgg.local:nsjtp-CTRL(ESTABLISHED)


3,显示的init 进程现在打开的文件


[根@ SVR-DB-测试~]#lsof的-C初始化
命令的PID USER FD型器件尺寸节点名称
的init 1根CWD DIR 253,0 4096 2 /
初始化1根RTD DIR 253,0 4096 2 /
初始化1根TXT REG 253,0 43496 524446 / sbin目录/ init的
初始化1根灰熊REG 253,0 130448 917826 / lib64/ld-2.5.so
的init 1根灰熊REG 253,0 1678480 917827 / lib64/libc-2.5.so
的init 1根纪念品REG 253,0 23520 917686 / lib64/libdl-2.5.so
的init 1根灰熊REG 253,0 247528 917844 / lib64/libsepol.so.1
的init 1根灰熊REG 253,0 95480 917845 / lib64/libselinux.so.1
初始化1根10U FIFO 0,16 2311的/ dev / initctl的


4,  看进程号为1 的进程打开了哪些文件


[根@ SVR-DB-测试~]#lsof的-P 1
COMMAND PID USER FD型器件尺寸节点名称
的init 1根CWD DIR 253,0 4096 2 /
初始化1根RTD DIR 253,0 4096 2 /
初始化1根TXT REG 253,0 43496 524446 / sbin目录/ init的
初始化1根灰熊REG 253,0 130448 917826 / lib64/ld-2.5.so
的init 1根灰熊REG 253,0 1678480 917827 / lib64/libc-2.5.so
的init 1根纪念品REG 253,0 23520 917686 / lib64/libdl-2.5.so
的init 1根灰熊REG 253,0 247528 917844 / lib64/libsepol.so.1
的init 1根灰熊REG 253,0 95480 917845 / lib64/libselinux.so.1
初始化1根10U FIFO 0,16 2311的/ dev / initctl的


5,  显示归属3520 的进程情况


[根@ SVR-DB-测试~]#lsof的-G 3520
COMMAND PID PGID用户FD型器件尺寸的节点名称
TNSLSNR 3520 3520甲骨文CWD DIR 253,5 4096 11059201 /家庭/ oracle的
TNSLSNR 3520 3520甲骨文RTD DIR 253,0 4096 2 /
TNSLSNR 3520 3520甲骨文TXT REG 253,5 431062 11408866 / home/oracle/10.2.0/db_1/bin/tnslsnr
TNSLSNR 3520 3520甲骨文纪念品REG 253,0 130448 917826 / lib64/ld-2.5.so
TNSLSNR 3520 3520预言灰熊REG 253,0 1678480 917827 / lib64/libc-2.5.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,0 23520 917686 / lib64/libdl-2.5.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,0 615136 917834 / lib64/libm- 2.5.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,0 141208 917829 / lib64/libpthread-2.5.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,0 109824 917839 / lib64/libnsl-2.5.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 20706622 11405436 / home/oracle/10.2.0/db_1/lib/libclntsh.so.10.1
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 3803097 11410641 / home/oracle/10.2.0/db_1/lib/libnnz10.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 83493 11407251 / home/oracle/10.2.0/db_1/lib/libons.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,0 53880 917532 / lib64/libnss_files-2.5.so
TNSLSNR 3520 3520甲骨文纪念品REG 253 5 8545 11407615 / home/oracle/10.2.0/db_1/lib/libskgxn2.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 513705 11410332 / home/oracle/10.2.0/db_1/lib/libocrutl10.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 636161 11410330 / home/oracle/10.2.0/db_1/lib/libocr10.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 657825 11410331 / home/oracle/10.2.0/db_1/lib/libocrb10。所以
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 1745769 11410365 / home/oracle/10.2.0/db_1/lib/libhasgen10.so
TNSLSNR 3520 3520甲骨文纪念品REG 253,5 61985 11410366 / home/oracle/10.2.0/db_1 / lib/libclsra10.so
TNSLSNR 3520 3520甲骨文0U CHR 1,3 2553 / dev / null的
TNSLSNR 3520 3520甲骨文1U CHR 1,3 2553 / dev / null的
TNSLSNR 3520 3520甲骨文2U CHR 1,3 2553 / dev / null的
TNSLSNR 3520 3520甲骨文3瓦特REG 253,5 318853012 11633459 / home/oracle/10.2.0/db_1/network/log/listener.log
TNSLSNR 3520 3520甲骨文4R FIFO 0,6 15661管
TNSLSNR 3520 3520甲骨文5R REG 253,5 11776 11410579 /家/ oracle/10.2.0/db_1/network/mesg/nlus.msb
TNSLSNR 3520 3520甲骨文6R REG 253,5 46592 11407160 / home/oracle/10.2.0/db_1/network/mesg/tnsus.msb
TNSLSNR 3520 3520甲骨文7瓦特FIFO 0,6 15662管
TNSLSNR 3520 3520甲骨文8U的IPv4 15665 TCP 203.aibo.com:恩库贝-LM(LISTEN)
TNSLSNR 3520 3520甲骨文9U UNIX 0xffff81021b7d6980 15666 / var / tmp中/ .oracle /秒#3520.1
TNSLSNR 3520 3520甲骨文10U UNIX 0xffff81021b7d66c0 15668 / var / tmp中/ .oracle /秒#3520.2


6.
依照文件夹/home/oracle 来搜寻,但不会打开子目录,用来显示目录下被进程开启的文件


[根@ SVR-DB-测试~]#lsof的+ D的/ home / oracle的
命令的PID USER FD型器件尺寸的节点名称
TNSLSNR 3520甲骨文CWD DIR 253,5 4096 11059201 /家庭/甲骨文


7.  打开/home/oracle 文件夹以及其子目录搜寻,用来显示目录下被进程开启的文件


[根@ SVR-DB-测试~]#lsof的+ D的/ home / oracle的


显示内容太多了,不显示了


8,lsof的,我
用以显示符合条件的进程情况


语法:lsof的-I [46] [协议] [@主机|地址hostaddr] [:服务|口]


46  - > IPv4或IPv6

协议 - > TCP或UDP

主机名 - > Internet主机名

地址hostaddr - > IPv4的位置

服务- >在/ etc /服务中的 服务名称(可以不只一个

端口- >  端口号可以不只一个


例:


[根@ SVR-DB-测试~]#lsof的,我  tcp@192.168.2.245:1521  -n的
命令的PID USER FD型器件尺寸的节点名称
oracle的15633 oracle的16U的IPv4 4069605 TCP 192.168.2.203:31580 - > 192.168.2.245:恩库贝-LM(ESTABLISHED)



[根@ SVR-DB-测试~]#lsof的,我  tcp@192.168.2.245:1521
COMMAND PID USER FD型器件尺寸的节点名称
oracle的15633 oracle的16U的IPv4 4069605 TCP 203.aibo.com:31580 - > 192.168.2.245:恩库贝-LM(ESTABLISHED)


lsof的-N  不将IP 转换为主机名,缺省是不加上-n的参数


9。  显示某用户的已经打开的文件(或该用户执行程序已经打开的文件)


[根@ SVR-DB-测试~]#lsof的-U甲骨文

[根@ SVR-DB-测试~]#lsof的-U 0


10。
仅打印进程,方便外壳脚本调用

[根@ SVR-DB-测试~]#lsof的-TC的sshd
3101
4545



关注:


进程调试命令:桁架使用strace ltrace


进程无法启动,软件运行速度突然变慢,程序的"SegmentFault" 等等都是让每个Unix 系统用户头痛的问题,而这些问题都可以通过使用truss strace ltrace 这三个常用的调试工具来快速诊断软件的" 疑难杂症"




-----结束-----