条件 logrotate 与 prerotate 脚本
conditional logrotate with prerotate script
我在集群中有两个 syslog-ng 服务器 (hot/cold),它们都映射相同的 NFS 共享。我想 运行 在 syslog 服务器上进行 logrotate 以轮换存储在 NFS 共享上的日志。问题是目前如果两个节点都有 /etc/logrotate.d/syslog-ng
配置,它会导致双重旋转。
我认为必须有一种方法可以使用 logrotate.d
中的 prerotate
节来确定轮换是否应该在服务器上发生。换句话说,如果被动节点尝试 运行 logrotate
,prerotate
脚本将首先检查节点是主节点。如果它不是主要的,我希望 prerotate
脚本到 exit
它之前的 logrotate
进程 运行s.
有人能给我指出正确的方向,让我知道如何制作 logrotate prerotate
脚本 exit
其父 logrotate
进程吗?
似乎如果预旋转脚本只是失败(returns 一个非零值,例如,如果您 运行 /bin/false 作为脚本或 "exit 1"来自 bash 脚本),则文件本身不会旋转。但是,以前的文件 (foo.log.1, ...) 确实会旋转。我想这可以算是logrotate的一个bug。
因此,如果您还使用 dateext(防止 foo.log.1 => foo.log.2 旋转),那么您应该已经准备就绪。
在手册页中找到了答案(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 '\([^0-9]\|^\)1\.2\.3\.4\([^0-9]\|$\)')"
if [ -z "$TESTCASE" ]; then
/bin/false
fi
如果 returns false
,logrotate 不会继续。
logrotate.d样本:
/var/log/blah/*/*.log {
firstaction
/usr/local/bin/amiactive.sh > /dev/null 2>&1
endscript
...
}
我在集群中有两个 syslog-ng 服务器 (hot/cold),它们都映射相同的 NFS 共享。我想 运行 在 syslog 服务器上进行 logrotate 以轮换存储在 NFS 共享上的日志。问题是目前如果两个节点都有 /etc/logrotate.d/syslog-ng
配置,它会导致双重旋转。
我认为必须有一种方法可以使用 logrotate.d
中的 prerotate
节来确定轮换是否应该在服务器上发生。换句话说,如果被动节点尝试 运行 logrotate
,prerotate
脚本将首先检查节点是主节点。如果它不是主要的,我希望 prerotate
脚本到 exit
它之前的 logrotate
进程 运行s.
有人能给我指出正确的方向,让我知道如何制作 logrotate prerotate
脚本 exit
其父 logrotate
进程吗?
似乎如果预旋转脚本只是失败(returns 一个非零值,例如,如果您 运行 /bin/false 作为脚本或 "exit 1"来自 bash 脚本),则文件本身不会旋转。但是,以前的文件 (foo.log.1, ...) 确实会旋转。我想这可以算是logrotate的一个bug。
因此,如果您还使用 dateext(防止 foo.log.1 => foo.log.2 旋转),那么您应该已经准备就绪。
在手册页中找到了答案(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 '\([^0-9]\|^\)1\.2\.3\.4\([^0-9]\|$\)')"
if [ -z "$TESTCASE" ]; then
/bin/false
fi
如果 returns false
,logrotate 不会继续。
logrotate.d样本:
/var/log/blah/*/*.log {
firstaction
/usr/local/bin/amiactive.sh > /dev/null 2>&1
endscript
...
}