下面是两个相同的 logrotate 配置示例,唯一的区别是postroate
第二个示例缺少的块>/dev/null 2>&1 || true
/var/log/nftables.log {
size +10M
maxage 30
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}
/var/log/nftables.log {
size +10M
maxage 30
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service
endscript
}
我想知道为什么第二个例子不好(我认为是),请解释一下到底是什么
>/dev/null 2>&1 || true
?
我的意思是每个字符的含义:>/dev/null
and 2>&1
and ||
andtrue
这是基本
bash
语法。您应该反复阅读man bash
任何 Linux Shell 教程或书籍。但是,这里是:
>/dev/null
将 STDOUT 流重定向到 NULL(无限数据接收器)设备,并将其丢弃。2>&1
将 STDERR 流重定向到 STDOUT(已重定向到/dev/null
)。||
是逻辑或运算符。如果(且仅当) 左侧的表达式||
失败(返回非零$STATUS
),则计算右侧的表达式||
并作为整个表达式的结果返回。true
是一个除了返回 SUCCESS 之外什么都不做的程序$STATUS
。总而言之,
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
意思是:执行命令,丢弃输出和错误消息。如果命令成功,则返回 SUCCESS。如果命令失败,则返回 SUCCESS。
请注意:这些
postrotate
命令由/bin/sh
,而不是解释/bin/bash
,因此任何 bash 扩展功能都将不起作用。