logrotate 的小bug

As we know, logrotate 是一个管理日志的程序。至于 logrotate 如何使用,在网上有很多这里就不叙述了。

现在来讲一下 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:  任何科学的本质都是哲学,好难懂这句话。奋斗

################################################################################################### 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值