现在来讲一下 logrotate的小bug;
首先给一个可以执行 logrotate命令的文件;
功能:实现aaaa.log 和 bbbb.log 拷贝到 /var/log/test 目录下;
以下是文件内容:(The file name is test)
/var/log/aaaa.log /var/log/bbbb.log {
sharedscripts
prerotate
/bin/mkdir -p /var/log/test
/bin/cp -f /var/log/aaaa.log /var/log/test/
/bin/cp -f /var/log/bbbb.log /var/log/test/
endscript
postrotate
echo "restart syslog"
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
echo "end"
endscript
}
执行命令: logrotate -vf test(这里是有加 f 的执行)
命令执行过程:
[root@localhost logrotate.d]# logrotate -vf test
reading config file test
Handling 1 logs
rotating pattern: /var/log/aaaa.log /var/log/bbbb.log forced from command line (no old logs will be kept)
empty log files are rotated, old logs are removed
considering log /var/log/aaaa.log
log needs rotating
considering log /var/log/bbbb.log
log needs rotating
rotating log /var/log/aaaa.log, log->rotateCount is 0
dateext suffix '-20150311'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/aaaa.log.1 to /var/log/aaaa.log.2 (rotatecount 1, logstart 1, i 1),
old log /var/log/aaaa.log.1 does not exist
renaming /var/log/aaaa.log.0 to /var/log/aaaa.log.1 (rotatecount 1, logstart 1, i 0),
old log /var/log/aaaa.log.0 does not exist
log /var/log/aaaa.log.2 doesn't exist -- won't try to dispose of it
rotating log /var/log/bbbb.log, log->rotateCount is 0
dateext suffix '-20150311'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/bbbb.log.1 to /var/log/bbbb.log.2 (rotatecount 1, logstart 1, i 1),
old log /var/log/bbbb.log.1 does not exist
renaming /var/log/bbbb.log.0 to /var/log/bbbb.log.1 (rotatecount 1, logstart 1, i 0),
old log /var/log/bbbb.log.0 does not exist
log /var/log/bbbb.log.2 doesn't exist -- won't try to dispose of it
running prerotate script
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/aaaa.log to /var/log/aaaa.log.1
disposeName will be /var/log/aaaa.log.1
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/bbbb.log to /var/log/bbbb.log.1
disposeName will be /var/log/bbbb.log.1
running postrotate script
restart syslog
end
removing old log /var/log/aaaa.log.1
removing old log /var/log/bbbb.log.1
[root@localhost logrotate.d]#
执行命令结果:
[root@localhost log]# ls
aaaa.log cron-20150215 prelink test
anaconda cron-20150222 restart vboxadd-install.log
audit dracut.log samba vboxadd-install-x11.log
bbbb.log gdm secure VBoxGuestAdditions.log
bittorrent lastlog secure-20150202 VBoxGuestAdditions-uninstall.log
boot.log mail secure-20150209 wtmp
boot.log-20150202 maillog secure-20150215 wtmp-20141120
boot.log-20150209 maillog-20150202 secure-20150222 xferlog
boot.log-20150215 maillog-20150209 speech-dispatcher Xorg.0.log
boot.log-20150222 maillog-20150215 spooler Xorg.0.log.old
btmp maillog-20150222 spooler-20150202 Xorg.1.log
btmp-20150302 messages spooler-20150209 Xorg.9.log
ConsoleKit messages-20150309 spooler-20150215 yum.log
cron ntpstats spooler-20150222
cron-20150202 pm-powersave.log sssd
cron-20150209 ppp tallylog
[root@localhost log]#
[root@localhost log]#
[root@localhost log]#
[root@localhost log]#
[root@localhost log]#
[root@localhost log]#
[root@localhost log]# ls
anaconda cron-20150222 prelink tallylog
audit dracut.log restart test
bittorrent gdm samba vboxadd-install.log
boot.log lastlog secure vboxadd-install-x11.log
boot.log-20150202 mail secure-20150202 VBoxGuestAdditions.log
boot.log-20150209 maillog secure-20150209 VBoxGuestAdditions-uninstall.log
boot.log-20150215 maillog-20150202 secure-20150215 wtmp
boot.log-20150222 maillog-20150209 secure-20150222 wtmp-20141120
btmp maillog-20150215 speech-dispatcher xferlog
btmp-20150302 maillog-20150222 spooler Xorg.0.log
ConsoleKit messages spooler-20150202 Xorg.0.log.old
cron messages-20150309 spooler-20150209 Xorg.1.log
cron-20150202 ntpstats spooler-20150215 Xorg.9.log
cron-20150209 pm-powersave.log spooler-20150222 yum.log
cron-20150215 ppp sssd
[root@localhost log]#
[root@localhost log]# ls test/
aaaa.log bbbb.log
[root@localhost log]#
可以看到 aaaa.log 和 bbbb.log 已经给删除了,复制到 test目录下了。
以上是执行logrotate 之后正常的结果;
#############################################################################################################
#
#############################################################################################################
现在是重点了,我们来讲下logrotate的异常情况喽。
修改之后的可执行logrotate命令的文件;
功能:实现 aaaa.log bbbb.log bbbb.log.1 文件拷贝到 /var/log/test目录下;
以下是文件内容(This file name is test1)
/var/log/aaaa.* /var/log/bbbb.* {
sharedscripts
prerotate
/bin/mkdir -p /var/log/test
/bin/cp -f /var/log/aaaa.* /var/log/test/
/bin/cp -f /var/log/bbbb.* /var/log/test/
endscript
postrotate
echo "restart syslog"
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
echo "end"
endscript
}
执行命令: logrotate -vf test1
执行命令过程:
[root@localhost logrotate.d]# logrotate -vf test1
reading config file test1
Handling 1 logs
rotating pattern: /var/log/aaaa.* /var/log/bbbb.* forced from command line (no old logs will be kept)
empty log files are rotated, old logs are removed
considering log /var/log/aaaa.log
log needs rotating
considering log /var/log/bbbb.log
log needs rotating
considering log /var/log/bbbb.log.1
log needs rotating
rotating log /var/log/aaaa.log, log->rotateCount is 0
dateext suffix '-20150311'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/aaaa.log.1 to /var/log/aaaa.log.2 (rotatecount 1, logstart 1, i 1),
old log /var/log/aaaa.log.1 does not exist
renaming /var/log/aaaa.log.0 to /var/log/aaaa.log.1 (rotatecount 1, logstart 1, i 0),
old log /var/log/aaaa.log.0 does not exist
log /var/log/aaaa.log.2 doesn't exist -- won't try to dispose of it
rotating log /var/log/bbbb.log, log->rotateCount is 0
dateext suffix '-20150311'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/bbbb.log.1 to /var/log/bbbb.log.2 (rotatecount 1, logstart 1, i 1),
renaming /var/log/bbbb.log.0 to /var/log/bbbb.log.1 (rotatecount 1, logstart 1, i 0),
old log /var/log/bbbb.log.0 does not exist
rotating log /var/log/bbbb.log.1, log->rotateCount is 0
dateext suffix '-20150311'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/bbbb.log.1.1 to /var/log/bbbb.log.1.2 (rotatecount 1, logstart 1, i 1),
old log /var/log/bbbb.log.1.1 does not exist
renaming /var/log/bbbb.log.1.0 to /var/log/bbbb.log.1.1 (rotatecount 1, logstart 1, i 0),
old log /var/log/bbbb.log.1.0 does not exist
log /var/log/bbbb.log.1.2 doesn't exist -- won't try to dispose of it
running prerotate script
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/aaaa.log to /var/log/aaaa.log.1
disposeName will be /var/log/aaaa.log.1
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/bbbb.log to /var/log/bbbb.log.1
disposeName will be /var/log/bbbb.log.1
fscreate context set to unconfined_u:object_r:var_log_t:s0
renaming /var/log/bbbb.log.1 to /var/log/bbbb.log.1.1
disposeName will be /var/log/bbbb.log.1.1
running postrotate script
restart syslog
end
removing old log /var/log/aaaa.log.1
removing old log /var/log/bbbb.log.1
error: error opening /var/log/bbbb.log.1: No such file or directory
[root@localhost logrotate.d]#
执行命令结果:
[root@localhost log]# ls
aaaa.log cron-20150209 ppp tallylog
anaconda cron-20150215 prelink test
audit cron-20150222 restart vboxadd-install.log
bbbb.log dracut.log samba vboxadd-install-x11.log
bbbb.log.1 gdm secure VBoxGuestAdditions.log
bittorrent lastlog secure-20150202 VBoxGuestAdditions-uninstall.log
boot.log mail secure-20150209 wtmp
boot.log-20150202 maillog secure-20150215 wtmp-20141120
boot.log-20150209 maillog-20150202 secure-20150222 xferlog
boot.log-20150215 maillog-20150209 speech-dispatcher Xorg.0.log
boot.log-20150222 maillog-20150215 spooler Xorg.0.log.old
btmp maillog-20150222 spooler-20150202 Xorg.1.log
btmp-20150302 messages spooler-20150209 Xorg.9.log
ConsoleKit messages-20150309 spooler-20150215 yum.log
cron ntpstats spooler-20150222
cron-20150202 pm-powersave.log sssd
[root@localhost log]# ls
anaconda cron-20150215 prelink test
audit cron-20150222 restart vboxadd-install.log
bbbb.log.1.1 dracut.log samba vboxadd-install-x11.log
bbbb.log.2 gdm secure VBoxGuestAdditions.log
bittorrent lastlog secure-20150202 VBoxGuestAdditions-uninstall.log
boot.log mail secure-20150209 wtmp
boot.log-20150202 maillog secure-20150215 wtmp-20141120
boot.log-20150209 maillog-20150202 secure-20150222 xferlog
boot.log-20150215 maillog-20150209 speech-dispatcher Xorg.0.log
boot.log-20150222 maillog-20150215 spooler Xorg.0.log.old
btmp maillog-20150222 spooler-20150202 Xorg.1.log
btmp-20150302 messages spooler-20150209 Xorg.9.log
ConsoleKit messages-20150309 spooler-20150215 yum.log
cron ntpstats spooler-20150222
cron-20150202 pm-powersave.log sssd
cron-20150209 ppp tallylog
[root@localhost log]# ls test/
aaaa.log bbbb.log bbbb.log.2
[root@localhost log]#
可以看到aaaa.log 和 bbbb.log已经被删除了,但是还保存了残留了两个文件 bbbb.log.1.1 和 bbbb.log.2 这是为啥呢?
而且看到 /var/log/test 下的文件是 aaaa.log bbbb.log bbbb.log.2 这三个文件 ,这又是为什么呢?
接下来一一道明:
1)在 bbbb.log 和 bbbb.log.1中分别写入不同内容,以下是文件内容信息:
[root@localhost log]# cat bbbb.log
this file is bbbb.log
[root@localhost log]# cat bbbb.log.1
this file is bbbb.log.1
[root@localhost log]#
2)接下来执行完 logrotate命令之后 bbbb.log.1.1 和 bbbb.log.2的内容:
[root@localhost log]# cat bbbb.log.1.1
this file is bbbb.log
[root@localhost log]# cat bbbb.log.2
this file is bbbb.log.1
[root@localhost log]#
3)再接下来就是 /var/log/test/目录下 bbbb.log 和 bbbb.log.2的内容:
[root@localhost test]# cat bbbb.log
this file is bbbb.log
[root@localhost test]# cat bbbb.log.2
this file is bbbb.log.1
[root@localhost test]#
恩,根据文件内容你现在应该就大概了解了吧。
First,正常来说执行完命令logrotate之后 :
aaaa.log 轮储为 aaaa.log.1;
bbbb.log 轮储为 bbbb.log.1;
But,在执行logrotate 命令时发现 bbbb.log 要轮储的文件 bbbb.log.1 TNN的竟然已经存在了,
系统自动将 原本存在的 bbbb.log.1 轮储为 bbbb.log.2了;(在logrotate 运行过程中也可以看到 renameing的命令)
好了已经明白了 bbbb.log.2 的内容为什么会是 :this file is bbbb.log.1 了吧。
那么关于 bbbb.log.1.1 的内容为什么会是:this file is bbbb.log ?
因为在运行 prerotate ~script的内容时候,系统将bbbb.log 轮储为 bbbb.log.1
之后又将 bbbb.log.1 轮储为 bbbb.log.1.1。所以 bbbb.log.1.1的内容 就是:this file is bbbb.log了。
#######################
# 好了,你以为ok了? #
# NO,NO,NO。 #
#######################
其实正常运行完 logrotate之后 只有文件 是以 .1 结尾的都会被删除的,但是为什么又会存在 logrotate.log.1.1呢?
在logrotate 结束的时候总会出现这样的 语句:
==》 removing old log /var/log/aaaa.log.1
但是在我们执行 logrotate -vf test1 之后也有出现了这样的语句:
==》removing old log /var/log/aaaa.log.1
removing old log /var/log/bbbb.log.1
error: error opening /var/log/bbbb.log.1: No such file or directory
这里多出了个 error,所以接下来执行 removing old log /var/log/bbbb.log.1.1 的语句没有被执行了;
好了,现在问题来了,为啥会出现error ?
根据我的推理:在删除 aaaa.log.1 时,会对 aaaa.log 进行open操作;
在删除 bbbb.log.1 时,会对 bbbb.log 进行open操作;
在删除 bbbb.log.1.1时,会对 bbbb.log.1进行open操作,但是 在上一步时你已经将 bbbb.log.1给 删除了,
所以 logrotate 执行不下去了,中断执行。
###################################################################################################
ps: 任何科学的本质都是哲学,好难懂这句话。
###################################################################################################