logrotate:即使日志没有被旋转,你也可以运行postrotate吗?

时间:2015-02-06 18:35:20

标签: bash logging backup logrotate

我有一个备份脚本(backup.sh)ssh进入另一台机器,压缩文件,然后scp将此文件(backup_data.tar.gz)返回到我的本地机器。我的本地计算机上还有一个logrotate文件:

/opt/backups/backup_data.tar.gz {
    nocompress
    daily
    rotate 7
    extension .tar.gz
    missingok
    postrotate
        /opt/backups/backup.sh
    endscript
}

因此,第一次执行logrotate时,要旋转的日志文件不存在(因为backup.sh脚本尚未执行)。我有missok,所以它继续前进并且不会抛出错误,但它似乎不执行backup.sh,因为在第一次运行后,backup_data.tar.gz仍然不存在。我相信postrotate只在文件被旋转时才会执行,有没有办法解决这个问题并让它无论如何执行?

3 个答案:

答案 0 :(得分:3)

如果至少有一个日志文件被旋转,

logrotate将只运行脚本(prerotate,postrotate,firstaction,lastaction)。通过运行backup.sh来引导进程一次就可以了,但是如果它将来失败,那么在你干预之前就不会有新的备份。

我会创建一个单独的logrotate配置文件,例如

/opt/backups/logrotate.conf

/opt/backups/backup_data.tar.gz {
    nocompress
    daily
    rotate 7
    extension .tar.gz
    missingok
}

接下来修改您的backup.sh并在脚本顶部插入对logrotate的调用:

logrotate --state=/opt/backups/logrotate.state /opt/backups/logrotate.conf

最后,将backup.sh设置为每天运行,例如crontab -e / sudo crontab -e -u backupuser

15 2    * * *   /path/to/backup.sh

答案 1 :(得分:0)

使用lastaction。执行一次,是否旋转

/opt/backups/backup_data.tar.gz {
    nocompress
    daily
    rotate 7
    extension .tar.gz
    missingok
    postrotate
        /opt/backups/backup.sh
    endscript
}

答案 2 :(得分:0)

你错了,请阅读下面的手册页。

您必须使用cron作业,如ben所说。

   lastaction/endscript
          The lines between lastaction and endscript (both of which must appear on lines by themselves) are executed (using /bin/sh)
     

在所有与通配符模式匹配的日志文件之后   旋转后旋转                 仅在轮换至少一个日志的情况下运行脚本。这些指令只能出现在日志文件中   定义。整个模式作为第一个参数传递给脚本。   如果脚本错误退出,则只需                 显示错误消息(因为这是最后一个操作)。另请参阅firstaction。