当前位置: 技术问答>linux和unix
请大家帮下忙,linux下怎样清空一个正在被写的文件,而不产生文件空洞
来源: 互联网 发布时间:2016-07-31
本文导语: 情况是这样的: 由于代码bug,用于生产的系统(不能重启)所产生的日志文件不再根据时间进行切换,所有的日志写入同一个文件,该日志文 件不断增大。现在尝试用crontab定时备份并清空文件。但是日志文...
情况是这样的:
由于代码bug,用于生产的系统(不能重启)所产生的日志文件不再根据时间进行切换,所有的日志写入同一个文件,该日志文
件不断增大。现在尝试用crontab定时备份并清空文件。但是日志文件虽然内容被清空,但是文件大小不变(文件空洞),用more命令查看,
发现文件前面一片空白,只有到文件底部发现有新写入的数据。
自我分析:
这是由于写日志的进程保存了文件指针值(文件描述表项),虽然清空了文件但该文件指针值依然不变,所以产生文件空洞。
求助:
用什么办法,可以备份当前日志内容,并减小日志文件大小,新内容又能被正确写入。
|
如果你能控制产生日志的程序,让它们每次写都重新打开,以append的方式就没有问题了
如果不行
那就用fifo吧
创建一个同名同路径的有名fifo
理论上可行,实际会不会出问题,是否应该这么做,不能保证
如果不行
那就用fifo吧
创建一个同名同路径的有名fifo
理论上可行,实际会不会出问题,是否应该这么做,不能保证
|
如果你不想修改原先的程序的话,那就没办法了。
|
如果不能修改原日志程序
那就只能试试有名管道fifo了
那就只能试试有名管道fifo了
|
叫个高手写个模块,动态挂到vfs的write操作函数上,然后可以在那里判断一下文件是不是你的日志,如果是就调整一下文件指针。
呵呵,应该不用挂机重启的,只要你的技术过关。
呵呵,应该不用挂机重启的,只要你的技术过关。
|
这样试试 比如你的日志为daily.log
#mv /path/daily.log /path/daily_1.log
#rm -rf /path/daily_1.log
#mv /path/daily.log /path/daily_1.log
#rm -rf /path/daily_1.log
|
ftruncate(daily_1.log)?