有时候,在Linux删除一个大文件的时候,你会发现磁盘空间并没有释放出来。
比方说下面这样的情况:
磁盘空间满:
[root@mha1 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_mha1-lv_root 42G 42G 0 100% / tmpfs 7.9G 88K 7.9G 1% /dev/shm /dev/sda1 485M 37M 423M 8% /boot [root@mha1 ~]#
最后,找到占用磁盘空间的是一个日志文件:nohup.out,如下:
[root@mha1 ~]# cd /script/ [root@mha1 script]# ls mha nohup.out shell [root@mha1 script]# [root@mha1 script]# du -sh * 44K mha 16K nohup.out 15G shell [root@mha1 script]# cd shell/ [root@mha1 shell]# ls call_do_mha.sh do_mha.sh do_mha.sh_orig nohup.out [root@mha1 shell]# [root@mha1 shell]# du -sh * 4.0K call_do_mha.sh 8.0K do_mha.sh 8.0K do_mha.sh_orig 15G nohup.out [root@mha1 shell]#
将该日志文件删除:
[root@mha1 shell]# rm -rf nohup.out [root@mha1 shell]# ls call_do_mha.sh do_mha.sh do_mha.sh_orig [root@mha1 shell]#
再次查看空间:
[root@mha1 script]# du -sh * 44K mha 16K nohup.out 24K shell [root@mha1 script]# [root@mha1 script]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_mha1-lv_root 42G 42G 0 100% / tmpfs 7.9G 88K 7.9G 1% /dev/shm /dev/sda1 485M 37M 423M 8% /boot [root@mha1 script]#
可以看到,文件确实被删除了;但是空间也确实没有释放出来。
问题原因:
在Linux中,通过rm删除的文件,会从文件系统中unlink。
但是,如果目标文件当前被使用(被某个进程占用),该进程仍然读取改文件,那么磁盘空间也会一直被占用,而不会被立即释放。
看看是什么进程在占用我刚才删除的文件:
[root@mha1 script]# lsof | grep --color "(deleted)" | grep "/script/shell/nohup.out" perl 543 root 1w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) perl 543 root 2w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 2493 root 1w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 2493 root 2w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 31368 root 1w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 31368 root 2w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) [root@mha1 script]# [root@mha1 script]# ps -ef | grep --color 31368 root 31368 1 1 Feb13 ? 03:53:33 sh call_do_mha.sh masterha_application_2_149_174 root 31825 12118 0 11:14 pts/0 00:00:00 grep --color 31368 [root@mha1 script]# [root@mha1 script]# ps -ef | grep --color 2493 root 870 2493 0 11:14 ? 00:00:00 sh /script/shell/do_mha.sh masterha_application_1 root 888 12118 0 11:14 pts/0 00:00:00 grep --color 2493 root 2493 1 0 Feb13 ? 03:17:34 sh call_do_mha.sh masterha_application_1 [root@mha1 script]# [root@mha1 script]# ps -ef | grep --color 543 root 543 1 0 Feb25 ? 00:07:39 perl /usr/bin/masterha_manager --conf=/etc/masterha_application_2_149_174.cnf --ignore_last_failover root 974 12118 0 11:15 pts/0 00:00:00 grep --color 543 [root@mha1 script]#
可以看到,确实是被进程占用了。
【lsof】:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
1、COMMAND
默认以9个字符长度显示的命令名称。可使用+c參数指定显示的宽度,若+c后跟的參数为零,则显示命令的全名
2、PID:进程的ID号
3、PPID
父进程的IP号,默认不显示,当使用-R參数可打开。
4、PGID
进程组的ID编号,默认也不会显示,当使用-g參数时可打开。
5、USER
命令的执行UID或系统中登陆的username称。默认显示为username,当使用-l參数时,可显示UID。
6、FD
文件的File Descriptor number,或者例如以下的内容:
7、TYPE
引用
IPv4 IPv4的包;
IPv6 使用IPv6格式的包,即使地址是IPv4的,也会显示为IPv6,而映射到IPv6的地址;
DIR 文件夹
LINK 链接文件
8、DEVICE
使用character special、block special表示的设备号
9、SIZE
文件的大小,假设不能用大小表示的,会留空。使用-s參数控制。
10、NODE
本地文件的node码,或者协议,如TCP等
11、NAME
挂载点和文件的全路径(链接会被解析为实际路径),或者连接两方的地址和端口、状态等
解决:
杀掉占用的进程:
[root@mha1 shell]# lsof | grep --color "(deleted)" | grep "/script/shell/nohup.out" perl 543 root 1w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) perl 543 root 2w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 2493 root 1w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 2493 root 2w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 31368 root 1w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) sh 31368 root 2w REG 253,0 15407460352 2093062 /script/shell/nohup.out (deleted) [root@mha1 shell]# [root@mha1 shell]# kill -9 31368 [root@mha1 shell]# kill -9 2493 [root@mha1 shell]# kill -9 543 [root@mha1 shell]# [root@mha1 shell]# lsof | grep --color "(deleted)" | grep "/script/shell/nohup.out" [root@mha1 shell]#
再次查看文件系统占用:
[root@mha1 shell]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_mha1-lv_root 42G 27G 13G 69% / tmpfs 7.9G 88K 7.9G 1% /dev/shm /dev/sda1 485M 37M 423M 8% /boot [root@mha1 shell]#
可以看到,已经释放出来了。
——————————
Done。