当使用 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 rsyslog
或invoke-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