生产环境,清理大文件不生效?应该这样做!
Posted androidstarjack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产环境,清理大文件不生效?应该这样做!相关的知识,希望对你有一定的参考价值。
点击上方 终端研发部,选择 设为星标
作者: 一得同学
来源: blog.csdn.net/weixin_44648216
Part1一个错误操作
在生产环境中, 假如我们要清空一个正在写入的文件, 比如 “清空 2020020501.log” 我见过许多同学会这样操作:
rm -f 2020020501.log && touch 2020020501.log
Part2为什么这个操作错误?
这样操作后会发现 2020020501.log 不再有新的写入了,或者说那些本来好好往 2020020501.log 写着日志的进程,并不能往新 touch 的 2020020501.log 写入日志:
tail -f 2020020501.log
.
此时执行 lsof | grep delete | grep 2020020501.log
还会发现,那些写日志的进程, 还 hold 着旧的 2020020501.log 文件句柄没释放:
testpro 27168 root 4u REG 252,17 124055696 54801882 /testlog/2020020501.log (deleted)
testpro 27169 root 4u REG 252,17 124055696 54801882 /testlog/2020020501.log (deleted)
testpro2 30035 root 4u REG 252,17 124064390 54801882 /testlog/2020020501.log (deleted)
testpro2 30035 30045 root 4u REG 252,17 124064390 54801882 /testlog/2020020501.log (deleted)
······
Part3怎么解决这个错误操作带来的问题?
为了让新 touch 的 2020020501.log 能继续写入log, 需要重启所有正在写入 2020020501.log 的进程。在这个测试 case 里面,需要重启 testpro 和 testpro2 。
由此可见, 如果不小心错误地将一个被许多进程读写中的热文件 rm
删除了, 那就需要重启所有相关进程,才能恢复正常读写。这就非常麻烦了,因此强烈不建议通过 rm
删除进程读写中的热文件。
Part4正确的操作是怎样的?
> 2020020501.log
或者
echo > 2020020501.log
-- END --
今日好文推荐
GET 和 POST请求的本质区别是什么?看完觉得自己太无知了...
MyBatis批量插入数据你还在用foreach?你们的服务器没崩?
点个在看少个 bug 👇
以上是关于生产环境,清理大文件不生效?应该这样做!的主要内容,如果未能解决你的问题,请参考以下文章
systemctl 启动某个程序,程序读取某个环境变量不生效的问题