做linux运维的同仁,大概率遇过这种头疼场景:服务器磁盘告警,十几G的tomcat、nginx日志塞满分区,直接rm -rf删掉日志文件后,磁盘占用量纹丝不动,必须重启应用才能释放空间,线上业务还得短暂中断。
其实很多人忽略了一个系统原生神器---truncate。它专门用来调整文件大小,清空正在被进程读写的日志不用停服务,io开销极低,是生产环境清理大文件的最优解。
truncate属于gnu核心工具集,核心功能只有一个:修改文件元数据,直接把文件扩容或压缩到指定大小,不会删除文件本身,只会改动文件存储长度。
基础语法:
最核心参数 -s(--size),用来定义目标文件尺寸,支持单位:
补充常用辅助参数:
-c/--no-create:文件不存在时,不自动新建空白文件(避免误生成垃圾文件)-r/--reference=文件:把目标文件尺寸改成和参考文件一模一样
1、核心刚需:清空日志文件(最常用)
-s 0 代表将文件尺寸设为 0 字节,清空全部内容,文件句柄、权限、属主完全保留,正在写入日志的进程无需重启,磁盘空间瞬间释放。
#清空nginx访问日志truncate -s 0 /var/log/nginx/access.log#清空tomcat catalina.out大日志truncate -s 0 /usr/local/tomcat/logs/catalina.out#清空docker容器json日志(容器不用重启)truncate -s 0 /var/lib/docker/containers/*/*.log
对比rm删日志的致命缺陷:
进程打开文件后,rm只是删除文件名,磁盘数据还被进程占用,空间不会释放;truncate直接截断内容,实时回收磁盘,业务无感知。
2、裁剪日志:只保留尾部指定大小日志
若不需要完整清空,只想保留末尾最新1M日志,直接用裁剪:
#保留文件最后1M内容,前面日志全部截断删除truncate -s 1M messages-20260531
适合调试场景,保留近期报错日志,清理之前冗余日志。
3、扩容文件:生成指定大小空白稀疏文件
测试磁盘、测试上传、模拟大文件场景时,不用dd缓慢生成,truncate秒创建稀疏文件(几乎不占用磁盘):
#新建/扩容文件至2G空白文件truncate -s 2G test.img#-c防止不存在时自动创建truncate -c -s 1G demo.data
备注:du -sh是统计实际大小,ll -lh显示逻辑大小,能看到大小。
增加-c后仅处理已存在文件,文件不存在时不会自动新建空白文。
4、同步两个文件大小:参考文件尺寸批量对齐
#将messages-20260608尺寸改成和messages-20260531完全一致 truncate -r messages-20260531 messages-20260608
5、批量截断匹配文件(搭配 find 组合)
磁盘爆满时批量清理多目录过期日志,比单纯rm安全:
#批量清空所有后缀为log的文件find /data/logs -name "*.log" -exec truncate -s 0 {} \;
三、注意事项
1、带锁定属性的文件无法截断
如果文件被chattr+a(仅追加)、chattr+i(不可修改)锁定,执行会提示权限不足,需要先解锁:
#先取消锁定再截断chattr -a -i app.logtruncate -s 0 app.log
2、扩容生成的稀疏文件≠真实占用磁盘
用truncate -s 10G test.img生成的大文件,只是标记逻辑尺寸,真实占用空间极小;如果需要实打实占用磁盘,改用dd命令,不要用 truncate。
3、绝对不要对数据库、业务数据文件执行截断
truncate 会直接抹除文件内容,MySQL、Redis 数据文件、配置文件一旦截断,数据直接丢失,无法恢复,仅允许操作日志类文件。
4、NFS 只读文件系统不支持 truncate
挂载的远程nfs目录、只读分区执行会报错,这种场景改用重定向>文件清空。
5、批量操作前务必预览文件
搭配 find 批量截断时,先加-ls 确认匹配文件,避免误截断业务配置:
#先查看匹配到哪些日志find /data/ -name "*.log" -ls#确认无误再执行截断find /data/ -name "*.log" -exec truncate -s 0 {} \;
四、日常自动化清理小脚本
很多单位日志轮询配置不全,写一行定时任务,每日凌晨自动截断超过指定大小(例如 5G)的日志文件,避免磁盘爆盘:
#定时脚本:查找大于5G的日志并清空find /data/logs -type f -name "*.log" -size +5G -exec truncate -s 0 {} \;
配合crontab每日执行,省去半夜磁盘告警紧急处理的麻烦。
五、总结
truncate核心优势:只改文件大小、不删除文件句柄,清理运行中日志不用重启服务,线上故障风险大幅降低;- 核心用法记牢:
truncate -s 0 日志文件 清空,truncate -s -XXM 裁剪尾部日志; - 区分场景:运行日志用 truncate,离线归档日志可用 rm,临时测试可用 > 重定向;
- 红线禁忌:切勿截断数据库、核心业务数据文件,批量操作先预览再执行。
很多运维只熟悉rm、find,忽略truncate这个轻量化工具,熟练掌握后能避开90% 磁盘清理引发的线上故障。如果文章对你日常运维有帮助,欢迎点赞收藏。
#运维#Linux运维#Linux实战#truncate