I'm using the script utility to record terminal sessions, and using logrotate (with copytruncate, script ignores HUP and keeps writing to the rotated file otherwise) to periodically upload chunks of what's happened so far to another server. This works great for the the actual screen contents.

Today I'm trying to also capture timing information, which script emits to STDERR. So my new script config looks like

script -faqt session.record 2> session.timing

The problem is that when I use logrotate on the timing data (session.timing) the backfilled file begins with a large number of null bytes in the output, which causes scriptreplay to hork when it reads the reconstructed file back in.

Is there a known problem (and hopefully workaround) using logrotate with the copytruncate option on STDERR redirected into a file?

You need to redirect stderr using 2>> (append). This is an issue with files opened without the O_APPEND flag and logrotate's copytruncate.

  • 1
    Great! You saved my life, thank you:) – turkenh Nov 24 '16 at 7:20

If I can't fix it, I can work around it by adding a postrotate script like:

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

Which will strip out any NULL bytes (since they're illegal anywhere in script timing files) of the first rotated file.

Presumably in a rotated file where NULL is sometimes OK, you could alter that sed command to strip just NULL bytes from the beginning of line zero in the file.

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.