日志轮转时“postrotateinvoke-rc.d rsyslog rotate”的用途,这个命令是否过时了?

日志轮转时“postrotateinvoke-rc.d rsyslog rotate”的用途,这个命令是否过时了?

当使用 logrotate 保持日志文件轮换时,我看到

postrotate
                invoke-rc.d rsyslog rotate > /dev/null
endscript

我知道postrotate在日志文件轮换后会让 bash 执行以下命令,但是执行该命令的目的究竟是什么?

最后,它现在过时了吗?(我似乎看到一条消息说anacron“您尝试调用的脚本已转换为 Upstart 作业,但 Upstart 作业不支持旋转。”)

答案1

该命令的目的是强制 rsyslog 重新打开它用来写入日志的文件。它在 logrotate 移动旧文件后使用,因此 rsyslog 开始写入新文件。

例如:rsyslog 将其大部分内容写入 /var/log/syslog。当 logrotate 启动时,它会将此文件移动到 /var/log/syslog.1 并创建一个新的空 /var/log/syslog。但您可能知道(但以防万一),rsyslog 不会写入名为 /var/log/syslog 的文件,而是写入它第一次打开文件时获得的文件描述符。您可以移动关联的文件,rsyslog 将继续写入它,因为它只知道文件描述符。当您将 /var/log/syslog 移动到 /var/log/syslog.1 时,rsyslog 将继续写入 /var/log/syslog.1,因为这是它的文件描述符指向的。事实上,您甚至可以删除该文件,rsyslog 将继续写入。当删除的文件似乎占用空间时,就会发生这种情况:文件描述符仍处于打开状态,因此空间不会被释放。仅当文件的最后一个引用被关闭时才会发生这种情况。

“rotate”参数旨在强制释放旧的文件描述符,并告诉 rsyslog 它必须再次打开文件,因此它会将新的文件描述符获取到新文件,并且可以正确处理旧的文件描述符。

至于它是否过时,恐怕我不知道。这就是我问你这个问题的原因 O:-) 但我认为问题在于 upstart 配置尚未准备好接受此选项。我已将其替换为手册页中的以下内容:

kill -HUP $(cat /var/run/rsyslogd.pid)

无论如何,这就是“旋转”所做的。希望这能有所帮助。

答案2

我遇到了类似的问题,似乎 rsyslog 的 logrotate 配置有问题,因此service rsyslog rotate它没有调用哪个,而是使用了reload rsyslog或类似的。结果发现这是实际上是一个错误,已在版本中修复7.4.4-1ubuntu5,但我的 Ubuntu 14.04 安装只看到版本7.4.4-1ubuntu2在 apt。

这是对我有用的修复方法:

编辑文件/etc/logrotate.d/rsyslog,将块内的行postrotate(例如reload rsysloginvoke-rc.d rsyslog rotate)替换为以下内容:

service rsyslog rotate >/dev/null 2>&1 || true

该块的外观应如下所示:

postrotate
    service rsyslog rotate >/dev/null 2>&1 || true
endscript

所有周围的线条均保持原样。

作为最后一步,手动运行一次命令可能是个好主意:

service rsyslog rotate

相关内容