生产环境,清理大文件不生效?应该这样做!

Posted androidstarjack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产环境,清理大文件不生效?应该这样做!相关的知识,希望对你有一定的参考价值。

点击上方 终端研发部,选择 设为星标

每天9:30点,干货准时奉上!

作者: 一得同学
来源: 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 --

今日好文推荐

GitHub上非常实用的40个开源JAVA项目

XShell收费太贵?快试试开源的NuShell,好用!

GET 和 POST请求的本质区别是什么?看完觉得自己太无知了...

MyBatis批量插入数据你还在用foreach?你们的服务器没崩?

点个在看少个 bug 👇

以上是关于生产环境,清理大文件不生效?应该这样做!的主要内容,如果未能解决你的问题,请参考以下文章

vue生产环境跨域不生效

systemctl 启动某个程序,程序读取某个环境变量不生效的问题

记一次清理缓存的小事情(chrome) chrome下清理缓存不生效的问题

生产环境日志清理脚本

大文件拆分问题的java实践(附源码)

eclipse的缓存清理之一