logrotating 时“postrotate invoke-rc.d rsyslog rotate”的目的,这个命令是否过时了?

fpg*_*ost 7 upstart rsyslog logrotate

当使用 logrotate 保持日志文件旋转时,我已经看到

postrotate
                invoke-rc.d rsyslog rotate > /dev/null
endscript
Run Code Online (Sandbox Code Playgroud)

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

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

rsu*_*rez 11

该命令的目的是强制 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:-) 但我相信问题是新贵配置还没有准备好接受这个选项。我从手册页用这个替换了它:

kill -HUP $(cat /var/run/rsyslogd.pid)
Run Code Online (Sandbox Code Playgroud)

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


小智 6

我遇到了类似的问题,似乎 logrotate 的 rsyslog 配置已损坏,因此service rsyslog rotate它使用reload rsyslog或类似的方法而不是调用实际有效的方法。原来这实际上是一个错误,它已在7.4.4-1ubuntu5版本中修复,但我安装的 Ubuntu 14.04 仅在 apt 中看到7.4.4-1ubuntu2版本。

这是对我有用的修复:

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

service rsyslog rotate >/dev/null 2>&1 || true
Run Code Online (Sandbox Code Playgroud)

块应该是这样的:

postrotate
    service rsyslog rotate >/dev/null 2>&1 || true
endscript
Run Code Online (Sandbox Code Playgroud)

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

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

service rsyslog rotate
Run Code Online (Sandbox Code Playgroud)