Я использую сценарий утилита для записи сеансов терминала и использование logrotate (с copytruncate
, сценарий игнорирует HUP и в противном случае продолжает запись в повернутый файл) для периодической загрузки фрагментов того, что произошло на данный момент, на другой сервер. Это отлично подходит для фактического содержимого экрана.
Сегодня я также пытаюсь получить информацию о времени, которую скрипт отправляет в STDERR. Итак, моя новая конфигурация скрипта выглядит как
script -faqt session.record 2> session.timing
Проблема в том, что когда я использую logrotate для временных данных (session.timing), файл с обратным заполнением начинается с большого количества нулевых байтов на выходе, что приводит к тому, что scriptreplay запускается, когда он считывает восстановленный файл обратно.
Есть ли известная проблема (и, надеюсь, обходной путь) с использованием logrotate с опцией copytruncate в STDERR, перенаправленной в файл?
Вам нужно перенаправить stderr, используя 2>>
(добавить). Это проблема с файлами, открытыми без O_APPEND
flag и copytruncate logrotate.
Если я не могу это исправить, я могу обойти это, добавив сценарий postrotate, например:
postrotate
sed -i -e 's/\o00//g' session.timing.1
endscript
Который выйдет из строя любой NULL байты (поскольку они незаконны везде в файлах времени сценария) первого повернутого файла.
Предположительно, в повернутом файле, где NULL иногда бывает нормально, вы можете изменить эту команду sed, чтобы удалить только NULL байты с начала нулевой строки в файле.