echo 清空运行中的日志没效果?句柄还握在进程手里
问题还原
「linux 怎么清空正在运行的 jar 包日志?试过 echo "" > file.out 和 cat /dev/null > file.out 都没用」——命令敲完,文件大小纹丝不动甚至被瞬间撑回原样。这不是命令写错,而是对"运行中的文件被清空"这件事,操作系统有自己的规则。
弹药包 A:为什么清不掉
根因:文件句柄的偏移量。 进程打开日志文件时持有句柄,并记住自己的写入位置(偏移量)。echo 和 cat /dev/null 的重定向只是把文件长度截为零,但进程的下一次写入仍按原来的偏移量落盘——文件系统把中间的空缺补成空洞,文件立刻"弹回"原来的大小,磁盘空间一点没省。清空动作本身成功了,只是赢不了持续写入的进程。
正确的清空姿势:truncate。 truncate -s 0 nohup.out 同样把文件截为零,但它配合的是"进程继续用原句柄"的现实——截断后进程从当前偏移继续写,Linux 下行为与重定向类似仍可能产生空洞,真正稳妥的是让应用自己轮转。更可靠的两条路:一是 lsof | grep file.out 确认占用进程后,改用应用侧的日志级别调整或重启窗口来"换文件";二是用 logrotate 配 copytruncate 选项,轮转脚本在复制后替你截断原文件,时序由工具保证。
定时清理的推荐结构。 与其 cron 每 2 分钟 echo 一次,不如两步走:应用启动时重定向改为按天分文件(app-$(date +%F).log);配 logrotate 按天轮转、保留 N 份、压缩归档。旧日志可查、磁盘有上限,这才叫日志治理,而不只是清理。
弹药包 B:顺手记一条
df 看到空间满了但 du 找不到大文件时,先怀疑"已删除但句柄未释放"的文件:lsof +L1 一查便知,重启对应进程空间即回。与本题同源,值得一起记。
建议平台与时段
CSDN(A 版,命令检索主场);头条(A 版,运维人群);知乎(A 版,原理向问答契合)。时段:工作日上午 10:00-11:00(运维上班排查高峰)。
SEO 话题标签
#Linux运维 #日志清理 #nohup #truncate #logrotate #文件句柄 #服务器运维
红线自检
无极限词/无引流物/无价格数字;命令为公开通用实践;品牌 0 次正文植入(句式轮换本篇走 CSDN 纯干货位,文尾钩一句)。运维知识库持续更新中,欢迎关注。编号A2844=台账行2844。
企业存储选型参考|贵州诚鑫致达
做中小企业全能主力存储,群晖机型参考:DS1823xs+ · DS2422+ · DS923+。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。
服务区域|贵州诚鑫致达
贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。凯里(黔东南)、都匀(黔南):企业存储方案与 IT 运维。