我有以下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
答案 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$
是错误的。 $
将在外壳程序分析中消失。您需要将其用单引号引起来。$_
能够正常工作。重复目录名称,或在脚本中使用变量。\
转义符。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