0%

[problems solution] linux:删除大文件,磁盘没有释放空间

问题描述#

用tab自动补全报错 No space left on device

1
# cd my-bash: cannot create temp file for here-document: No space left on device
查看磁盘空间,发现/dev/dm-0占用100%
1
2
3
4
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/dm-0 7.8G 7.8G 20K 100% /
...
用du -h --max-depth / 分析出/var/log文件占用了很大的空间

暴力地用 rm -r /var/log/ 删除,再次查看usr文件,发现var空间下已无log文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# rm -r /var/log/

# du -h --max-depth=1 /var
337M /var/lib
90M /var/cache
0 /var/tmp
48M /var/spool
6.3M /var/backups
0 /var/local
0 /var/opt
144K /var/mail
192K /var/initsh
481M /var
查看磁盘空间还是却未变
1
2
3
4
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/dm-0 7.8G 7.8G 20K 100% /
...
## 问题排查与解决 突然想到可能是var/log文件还被占用着,磁盘空间没有成功释放。使用lsof查看
1
2
3
4
5
6
7
8
9
10
11
12
13
# lsof  -u root|grep var/log
rsyslogd 16083 root 5w REG 253,0 4149248 27063243 /var/log/auth.log (deleted)
rsyslogd 16083 root 6w REG 253,0 1463746560 27104493 /var/log/syslog (deleted)
rsyslogd 16083 root 7w REG 253,0 1826508800 27063246 /var/log/messages (deleted)
rsyslogd 16083 root 8w REG 253,0 3448832 27063245 /var/log/cron.log (deleted)
rsyslogd 16083 root 10w REG 253,0 2568192 27063241 /var/log/mail.log (deleted)
rsyslogd 16083 root 11w REG 253,0 2568192 27104495 /var/log/mail.info (deleted)
rsyslogd 16083 root 12w REG 253,0 2568192 27063239 /var/log/mail.warn (deleted)
rsyslogd 16083 root 13w REG 253,0 2564096 27063240 /var/log/mail.err (deleted)
rsyslogd 16083 root 14w REG 253,0 3464038 27063242 /var/log/daemon.log (deleted)
rsyslogd 16083 root 15w REG 253,0 20480 27063244 /var/log/user.log (deleted)
rsyslogd 16083 root 16w REG 253,0 528 27104496 /var/log/kern.log (deleted)
rsyslogd 16083 root 17w REG 253,0 528 27063254 /var/log/debug (deleted)
果然被rsyslogd程序占用中,重启一波rsyslogd,发现成功释放了磁盘空间
1
2
3
4
5
# /etc/init.d/rsyslog restart

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/dm-0 7.8G 4.7G 3.1G 61% /

问题思考#

暴力使用rm -r 清除正在被占用的文件例如 var/log,并不会释放磁盘空间。 可以在删除之前 先清空文件,再删除文件 这样能快速释放磁盘空间

1
2
echo “” > xxx.log
rm -rf xxx.log

如何定期清理#

crontab指令可以定期执行命令, 对于定期清理日志, 当然也要用crontab。具体定期清理方式请阅读 crontab定期执行命令指令,