logrotate 配置文件强制为 0644 属性

在一次包更新后,发现 Nginx 服务器的每晚日志切割不再进行了。找遍了各种地方,最后在一次偶然的ls -l中发现:

# ll /etc/logrotate.d/
total 64
-rw-r--r-- 1 root root  326 2012-08-04 06:08 apache2
-rw-r--r-- 1 root root   84 2009-02-08 05:18 apt
-rw-r--r-- 1 root root   79 2008-12-05 17:15 aptitude
-rw-r--r-- 1 root root  330 2008-03-08 05:36 atop
-rw-r--r-- 1 root root  232 2011-11-10 14:33 dpkg
-rw-r--r-- 1 root root  267 2013-01-31 13:20 foreman-proxy
-rw-r--r-- 1 root root  151 2007-09-29 19:23 iptraf
-rw-r--r-- 1 root root  880 2012-10-29 17:10 mysql-server
-rwxr-xr-x 1 root root  356 2012-08-05 00:17 nginx
-rw-r--r-- 1 root root 1061 2008-03-08 05:36 psaccs_atop
-rw-r--r-- 1 root root  512 2008-03-08 05:36 psaccu_atop
-rw-r--r-- 1 root root  260 2012-06-23 00:52 rabbitmq-server
-rw-r--r-- 1 root root  126 2012-06-09 00:22 redis-server
-rw-r--r-- 1 root root  515 2012-09-27 02:40 rsyslog
-rw-r--r-- 1 root root  285 2008-11-18 21:20 stunnel4

这里的nginx多了可执行权限。于是我尝试性的执行了chmod -x nginx;结果居然真的恢复了。

这事儿说起来蛮奇怪了。于是去 https://fedorahosted.org/logrotate 找来 logrotate 的源码看,结果在logrotate-3.8.3/config.c 里发现这么一段:

 661                 if ((sb.st_mode & 07533) != 0400) {
 662                         message(MESS_DEBUG,
 663                                 "Ignoring %s because of bad file mode.\n",
 664                                 configFile);
 665                         close(fd);
 666                         return 0;
 667                 }

只有文件权限是 0644 的时候,配置文件才会被读取!0755 的与结果是 0511,不等于 0400。相关 st_mode 的内容可以通过 man 2 stat 查看。

可以写一小段 perl 代码来验证:

#!/usr/bin/perl
my $mode = (stat($ARGV[0]))[2];
printf "Permissions are %04o\n", $mode & 07533;

在 ChangeLog 里,看到如下一段话:

2.1 -> 2.2:
    - ignore nonnormal files when reading config files from a directory
    - (these were suggested and originally implemented by
      Henning Schmiedehausen)

不过比较早了,就懒得从历史堆里再翻为什么当初会有这么个提议了…………


http://chenlinux.com/2013/03/18/logrotate-configuration-files-mode/

logrotate是一个用于管理日志文件的工具,它可以定期轮转、压缩和删除日志文件,以便节省磁盘空间并保持日志文件的可读性。logrotate配置文件通常位于/etc/logrotate.conf或/etc/logrotate.d/目录下。 logrotate配置文件的基本结构如下: 1. 日志文件路径:指定需要轮转的日志文件路径,可以使用通配符来匹配多个文件。 2. 轮转规则:定义了轮转的频率和方式,包括轮转周期、保留的旧日志文件数量、是否压缩等。 3. 轮转后的操作:可以指定轮转后需要执行的操作,如发送通知、重新启动相关服务等。 以下是一个logrotate配置文件的示例: ``` /var/log/example.log { rotate 7 daily compress delaycompress missingok notifempty create 0644 root root postrotate /usr/bin/killall -HUP example_daemon endscript } ``` 上述配置文件中,"/var/log/example.log"是需要轮转的日志文件路径。配置项的含义如下: - rotate 7:保留7个旧日志文件。 - daily:每天执行一次轮转。 - compress:压缩旧日志文件。 - delaycompress:延迟压缩,下次轮转时才压缩上一次轮转生成的旧日志文件。 - missingok:如果日志文件不存在,不报错。 - notifempty:如果日志文件为空,不轮转。 - create 0644 root root:创建新的日志文件,并设置权限为0644,所有者为root。 - postrotate...endscript:在轮转后执行的操作,此处是重新加载example_daemon服务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值