2> 使用 logrotate 旋转创建的文件中是否存在空字节?

2> 使用 logrotate 旋转创建的文件中是否存在空字节?

我正在使用脚本实用程序来记录终端会话,并使用 logrotate(使用copytruncate,否则脚本会忽略 HUP 并继续写入已旋转的文件)定期将迄今为止发生的情况上传到另一台服务器。这对于实际的屏幕内容非常有用。

今天我还尝试捕获脚本发送到 STDERR 的时间信息。所以我的新脚本配置如下

script -faqt session.record 2> session.timing

问题是,当我在时间数据(session.timing)上使用logrotate时,回填文件以输出中的大量空字节开始,这导致scriptreplay在读回重建的文​​件时发生故障。

在 STDERR 重定向到文件中时,使用带有 copytruncate 选项的 logrotate 是否存在已知问题(并希望可以解决)?

答案1

您需要使用 (append) 重定向 stderr 。这是使用未带标志和 logrotate 的 copytruncate2>>打开的文件时出现的问题。O_APPEND

答案2

如果我无法修复它,我可以通过添加 postrotate 脚本来解决这个问题,例如:

postrotate
   sed -i -e 's/\o00//g' session.timing.1
endscript

这将剥离任何NULL 字节(因为它们是非法的任何地方在脚本计时文件中)第一个旋转文件。

假设在旋转的文件中,NULL 有时是可以的,您可以改变该 sed 命令以从文件中第零行的开头删除 NULL 字节。

相关内容