0

我的 apache 默认 logrotate 脚本是:

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

我了解第 6 行的输出和错误重定向,但有人可以解释一下的目的|| true吗?省略那一点的潜在后果是什么?

4

1 回答 1

3

logrotate实用程序运行postrotate(或prerotate)脚本时,它会检查脚本返回的错误代码。特别是,当sharedscripts指定时,错误处理如下(引自man logrotate,强调补充):

共享脚本

通常,为每个旋转的日志运行 prerotate 和 postrotate 脚本,并将日志文件的绝对路径作为第一个参数传递给脚本。这意味着单个脚本可以针对匹配多个文件的日志文件条目运行多次(例如 /var/log/news/* 示例)。如果指定了 sharedscripts,则脚本只运行一次,无论有多少日志匹配通配符模式,并将整个模式传递给它们。但是,如果模式中的任何日志都不需要轮换,则根本不会运行脚本。如果脚本因错误退出,则不会对任何日志执行其余操作。 此选项覆盖 nosharedscripts 选项并暗示创建选项。

|| true防止http reload命令返回错误条件,从而避免上述情况。

man bash(在“列表”部分)描述||

command1 || command2

command2当且仅当command1返回非零退出状态时才执行。AND 和 OR 列表的返回状态是列表中执行的最后一个命令的退出状态。

man true详细解释true,但我认为标题就足够了:“什么都不做,成功”。

简而言之,command1 || true首先执行command1. 如果成功,结果就是成功。否则,它执行true,什么也不成功,因此成功。所以它总是执行command1并且总是成功

于 2014-01-31T18:44:01.123 回答