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 rsyslog
或invoke-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)