问题:定期通过rm删除日志文件,导致删除后没有新的日志生成(没有做日志分割的情况)

解决方法:通过清空日志内容的方式:>/disk2/maintain/onebox/onebox-xml/log/fund.err

 

作为系统管理员,需要对日志的删除做好管理,以避免磁盘满了对服务造成影响,下面介绍几种方法:

1)有日志分割

 0 4 * * * find /disk2/maintain/deskdict/resin-3.0.21/logs-mtime +10 -exec rm -f {} \;

 

或者

0 4 * * * find /disk2/maintain/deskdict/resin-3.0.21/logs/ -mtime +10 |xargs rm -f

上面两种方法会在凌晨4点将/disk2/maintain/deskdict/resin-3.0.21/logs/目录下10天前的文件删除,注意:

a、  如果10天前的日志文件数量超过rm命令能够接收的参数个数,find exec的方式将会报错,最好使用find xargs的方式,这种方法不会有参数个数超出的问题。

b、  如果只是删除日志文件最好使用rm–f参数,不要加上-r,以避免不必要的错误。

2)无日志分割

这种情况,使用rm来删除日志文件的话,会导致服务不再生成新的日志,需要重启服务才能生成新的日志,可以通过下面的方式,将日志文件的内容清空而不是删除日志文件。

看到老男孩博客中关于rm删除文件的原理,在这里做个补充

简单介绍一下概念:i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。rm只是删除文件的i_nlink,只有当i_nlink和i_count都为0的时候,文件才算是真正意义上的删除(文件所在的数据块才会被新的数据写入覆盖),如果文件的i_nlink不为零,一般认为会有改文件的硬链接(副本),如果i_count不为零,则文件被调用。如果i_nlink为零则我们在硬盘上使用命令(ls,df)是无法看到文件的情况。此处就存在一种情况,如果一个程序在打日志的时候没有做日志分割,当我们rm掉该日志的时候只是删除了i_nlink此时i_count不为零,就导致实际的日志还被程序使用并没有释放磁盘空间。

详细情况请参考http://oldboy.blog.51cto.com/2561410/791322

0 1 * * 1 >/disk2/maintain/onebox/onebox-xml/log/fund.err

每周一的凌晨1点将日志文件fund.err的内容清空