Назад | Перейти на главную страницу

Нулевые байты в файле, созданном с помощью 2>, повернутого с помощью logrotate?

Я использую сценарий утилита для записи сеансов терминала и использование 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 байты с начала нулевой строки в файле.