我正在使用脚本实用程序来记录终端会话,并使用 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 字节。