Logrotate脚本未运行

时间:2019-04-24 03:05:30

标签: linux bash unix logging logrotate

我有以下logrotate脚本

var xml;
var promises = [];
req.body.map((product) => {
    promises.push(admin.database().ref(product.refitem).once('value', (snapshot) => {
        const value = snapshot.val();
        const price = value.price;
        return price;
    })
})
Promise.all(promises).then((prices) => {
    prices.forEach((price) => {
        ...
    });
    //rest of code sending the xml via POST to other server
});

  • 我要实现的目标:-

    在保留30天后删除日志文件之前,请复制到另一个文件夹。

我正在调试模式下运行此logstash配置

/path/to/folder {
   daily
   rotate 30
   notifempty
   sharedscripts
   copytruncate
   compress
   dateext


   preremove
     if file --mime-type "$1" | grep -q gzip$; then
          mkdir -p /path/to/archive/folder && cp $1 $_
     fi
   endscript
}

从日志的外观来看,轮换工作正常,但是它甚至没有运行logrotate -d $CONFIG_FILE 脚本。 我还没有实时运行此配置,因为我想先进行测试。

  

logrotate版本3.8.6

3 个答案:

答案 0 :(得分:1)

我不确定您是在问为什么preremove无法运行,还是您的脚本看起来还可以。

预删除以及如何测试

我不认为logrotate如果不删除文件(按preremove)不会运行-d脚本。我设置了一个测试用例,并在strace下运行它。 logrotate -d找到了需要删除的文件,并说可以删除它们,但是没有运行preremove代码。坦白地说,这对我来说是有意义的,也是我所期望的,因为preremove可能会像删除本身一样具有破坏性。

要执行测试,我认为您需要在另一个目录中重现您的实时环境并实际运行它。不要使用完整大小的文件,而只使用几行的虚拟文件。创建一个脚本来构建您的测试文件夹,以便您可以轻松地再现测试。使用touch设置时间戳。例如:

for n in $(seq 1 30); do
    cp test.log test.log.$n
    gzip test.log.$n
    touch -d "now - $n day" test.log.$n.gz
done

脚本本身

  • grep -q gzip$是错误的。 $将在外壳程序分析中消失。您需要将其用单引号引起来。
  • 正如其他人所写,我不希望$_能够正常工作。重复目录名称,或在脚本中使用变量。
  • 我认为您不需要按照建议在EOL使用\转义符。
  • 您可能想要cp -p,就像有人建议的那样。
  • 如果文件很大,则cp会变慢。如果归档文件位于同一文件系统上,请考虑使用ln(而不是ln -s!)。这将是即时的。
  • 使用file --mime-type也许可以正常工作,但是坦率地说,在这种情况下,我只是将其基于文件名,因为logrotate可以可靠地将.gz附加在任何file会附加的文件上返回gzip。对于以expr "$1" : '.*gz$'结尾的任何$1.gz将给出一个非零数字作为标准输出。对于不以.gz结尾的文件名,它将为标准输出精确给出数字0。

答案 1 :(得分:0)

您可能缺少some examples

中的换行符
preremove
    # debug line
    systemd-cat -t "rot-pre-rm" echo "preremove block, file: $1"
    if file --mime-type "$1" | grep -q gzip$; then \
        cp -p "$1" /path/to/archive/syslog/; \
    fi; \
endscript

答案 2 :(得分:0)

我认为您的条件本身还没有达到 true ,您可以在回撤前进行调试之前放回声吗?尝试手动执行if条件并查看。

# file --mime-type * | grep -i *.1
audit.log.1: text/plain
# file --mime-type * | grep -i *.1$
# file --mime-type * | grep -q *.1$
# file --mime-type * | grep -q *.1