Как я могу исправить "/etc/cron.daily/logrotate: gzip: stdin: размер файла изменен при zipping"?

в последние дни я получаю ежедневную почту из задачи cron logrotate:

/etc/cron.daily/logrotate:

gzip: stdin: размер файла изменен при zipping

Как я могу это исправить?

Спасибо, Джан Марко.

Ответы

Ответ 1

Здесь сообщение в блоге на французском языке, которое дает решение.

На английском вы можете прочитать этот отчет об ошибке.

Чтобы подвести итог:

  1. Сначала вы должны добавить --verbose в сценарий /etc/cron.daily/logrotate чтобы в следующий раз запустить дополнительную информацию, чтобы определить, какой журнал ротации вызывает проблему.

    #!/bin/sh
    
    test -x /usr/sbin/logrotate || exit 0
    /usr/sbin/logrotate --verbose /etc/logrotate.conf'
    
  2. Затем вы должны добавить опцию delaycompress в конфигурации logrotate.

Как пример, я добавляю конфигурацию nginx logrotate:

/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
...

}

Ответ 2

upstart закроет (и снова откроет) свой файл журнала, когда обнаружит, что файл удален. Однако, если вы посмотрите на то, что делает gzip, вы увидите, что он не удаляет файл до тех пор, пока он не записывает выходной файл. Это означает, что всегда есть условие состязания, при котором строки журнала могут быть потеряны при записи журнала строк в формате gzipping.

Вы можете отключить предупреждение, используя gzip --quiet, но на самом деле это не скрывает тот факт, что вы все равно можете потерять строки журнала.

Это означает, что delaycompress не является общим delaycompress этой delaycompress. Это конкретное решение для конкретной проблемы.

Реальным решением для этого, вероятно, является комбинация delaycompress и возможности отправить сигнал процессу. Это приведет к тому, что условия гонки исчезнут на практике (если вы не будете вращаться несколько раз в секунду :)).