我使用iotop工具定期抓取本地的io统计数据,通过zabbix客户端的key发送给zabbix服务器。这样就可以在zabbix上实时看到所有服务器的io数据了。在使用过程中发现。存放io数据的文件iotop.log增长很快。为了有效利用磁盘,就使用logrotate功能,对iotop.log文件进行rotate。配置如下:

/var/log/iotop.log {

    daily

    dateext

    rotate 5

    create 0755 root root

    sharescripts

    prerotate

              pkill  -9 iotop

    endscript

    postrotate

             /usr/sbin/iotop -d 60 -b -o -k >>/var/log/iotop.log

    endscript

}


手工执行logrotate命令,强制轮询iotop.log文件,没有问题。但当系统调用cron执行/etc/cron.daily/logrotate时,提示错误:

pkill: 13194 - Permission denied

无法执行。但手工执行都没有问题。为此折腾了好几天。

昨天终于解决了。问题原因是:

默认情况下,logrotate会把原始的iotop.log重命名,然后重新生成一个iotop.log文件。但我的程序iotop一直在调用iotop.log文件。导致iotop.log文件被重命名后,iotop程序还是把日志写到重命名后的文件中。导致我的zabbix客户端获取iotop.log中数据失败。

在本群中问了,网上资料也找了。没有结果。只能自己看logrotate的man。发现使用参数“copytruncate”可以解决问题。copytruncate的意思是先把原始文件拷贝一份重命名,然后把原始文件清空。这样,我简化我的logrotate文件为:

/var/log/iotop.log {

    copytruncate

    daily

    dateext

    rotate 5

    create 0755 root root

}


现在工作一切正常。