带有预旋转脚本的条件logrotate

时间:2017-07-28 20:54:52

标签: bash logrotate

我在群集中有两个syslog-ng服务器(热/冷),两者都映射相同的NFS共享。我想在syslog服务器上运行logrotate来旋转存储在NFS共享上的日志。问题是,如果两个节点都具有/etc/logrotate.d/syslog-ng配置,则会导致双重旋转。

我认为必须有一种方法可以在prerotate中使用logrotate.d节来确定旋转是否应该在服务器上发生。换句话说,如果被动节点尝试运行logrotate,则prerotate脚本将首先检查节点是否为主节点。如果它不是主要的,我希望prerotate脚本在exit进程运行之前logrotate。{/ p>

有人能指出我正确的方向,弄清楚如何制作logrotate prerotate脚本exit其父logrotate进程吗?

2 个答案:

答案 0 :(得分:1)

看起来好像预旋转脚本只是失败(返回一个非零值,例如,如果你运行/ bin / false作为脚本或从bash脚本中“退出1”),那么文件本身就不会转动。但是以前的文件(foo.log.1,...)确实会被轮换。我想这可以被认定为logrotate的错误。

因此,如果您还使用dateext(这会阻止foo.log.1 => foo.log.2轮换),您应该全部设置。

答案 1 :(得分:1)

在手册页中找到答案(RTFM,哎呀!)

   firstaction/endscript
          The  lines between firstaction and endscript (both of which must
          appear on lines by themselves) are executed (using /bin/sh) once
          before  all  log  files  that  match  the wildcarded pattern are
          rotated, before prerotate script is run and only if at least one
          log  will actually be rotated.  These directives may only appear
          inside a log file definition. Whole pattern  is  passed  to  the
          script  as  first  argument.  If the script exits with error, no
          further processing is done. See also lastaction.

我创建了一个firstaction bash脚本,以检查节点上是否存在负载均衡的IP:

#!/bin/bash

TESTCASE="$(ifconfig | grep 1.2.3.4)"

if [ -z "$TESTCASE" ]; then
        /bin/false
fi

如果返回false,则logrotate不会继续。

logrotate.d sample:

/var/log/blah/*/*.log {
    firstaction
    /usr/local/bin/amiactive.sh > /dev/null 2>&1
    endscript
    ...
    }