当前位置:首页>Linux>运维干货:别只会rm删日志!Linux truncate命令实战用法,线上清理零故障

运维干货:别只会rm删日志!Linux truncate命令实战用法,线上清理零故障

  • 2026-10-11 06:50:28
运维干货:别只会rm删日志!Linux truncate命令实战用法,线上清理零故障

做linux运维的同仁,大概率遇过这种头疼场景:服务器磁盘告警,十几G的tomcat、nginx日志塞满分区,直接rm -rf删掉日志文件后,磁盘占用量纹丝不动,必须重启应用才能释放空间,线上业务还得短暂中断。

其实很多人忽略了一个系统原生神器---truncate。它专门用来调整文件大小,清空正在被进程读写的日志不用停服务,io开销极低,是生产环境清理大文件的最优解。

一、truncate命令核心作用

truncate属于gnu核心工具集,核心功能只有一个:修改文件元数据,直接把文件扩容或压缩到指定大小,不会删除文件本身,只会改动文件存储长度。

基础语法:

truncate [参数] 目标文件

最核心参数 -s(--size),用来定义目标文件尺寸,支持单位:

  • b:字节(默认)、K:KB、M:MB、G:GB
  • 数字前带+:扩容文件;带-:从尾部裁剪指定大小

补充常用辅助参数:

  1. -c/--no-create:文件不存在时,不自动新建空白文件(避免误生成垃圾文件)
  2. -r/--reference=文件:把目标文件尺寸改成和参考文件一模一样
二、truncate的实战用法

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

最新文章

随机文章