直接删除正在写入的日志文件无法释放磁盘空间,因进程仍向原inode写入;应使用sudo >、truncate -s 0或cat /dev/null清空文件,或配置logrotate自动管理。

sudo 权限下直接清空或轮转日志,比删文件更安全——删了 /var/log/syslog 这类被进程持续写入的文件,服务会继续往旧 inode 写,新文件不生效,磁盘空间反而释放不了。
为什么不能直接用 rm 删除正在写的日志文件
很多服务(如 rsyslog、nginx、mysql)以“打开文件句柄 + 持续追加”方式写日志。一旦你 rm /var/log/syslog,文件名没了,但进程还在往原 inode 写数据,磁盘空间不会释放,df 看不到变化,lsof | grep deleted 却能看到一堆 “deleted” 标记的大文件。
真正释放空间,得让进程重新打开文件,或者清空内容本身。
快速清空单个日志文件的 3 种可靠方式
以下命令都保留文件路径、权限、属主和 inode,服务无需重启:
-
sudo > /var/log/syslog—— 最简,shell 内置,0 字节截断,适合日常手动操作 -
sudo truncate -s 0 /var/log/nginx/access.log—— 对超大文件(>1GB)更高效,且支持-s 1M保留头部 1MB 日志用于调试 -
sudo cat /dev/null > /var/log/auth.log—— 效果同上,脚本里语义更明确,避免重定向符号歧义
别用 echo "" > file:它写入一个换行符,文件大小是 1 字节,某些日志分析工具会误判为“有内容”。真要留空行,加 -n:echo -n "" > file。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
按时间或大小批量清理旧日志文件
针对已归档、带日期后缀的日志(如 messages-20260601、secure.1.gz),用 find 安全删除:
- 删 30 天前的压缩日志:
find /var/log -name "*.gz" -mtime +30 -delete - 删大于 100MB 的旧日志:
find /var/log -type f -size +100M -name "*.log.*" -delete - 注意:
-mtime +30是“30×24 小时之前”,不是“30 天前当天零点”。时间精度要求高时,改用-mmin +43200(30 天 = 43200 分钟)
长期管理必须配 logrotate,而不是靠手动
手动清空治标不治本。logrotate 才是生产环境标配:
- 配置在
/etc/logrotate.d/下,比如/etc/logrotate.d/nginx,每轮转一次就自动压缩+删老文件 - 关键参数别漏:
daily、rotate 7、compress、missingok、notifempty、create 644 root root - 测试配置是否生效:
sudo logrotate -d /etc/logrotate.conf(-d 干运行看模拟行为) - 强制立即执行:
sudo logrotate -f /etc/logrotate.conf,但别频繁用,可能干扰正常周期
journalctl 日志另算:sudo journalctl --vacuum-size=500M 或 --vacuum-time=30d,否则 /run/log/journal/ 下的二进制日志会悄悄吃掉几 GB。

















