Logrotate сжимать файлы после postrotate script

У меня есть приложение, создающее действительно тяжелый большой файл журнала каждый день (~ 800 МБ в день), поэтому мне нужно сжать их, но поскольку сжатие требует времени, я хочу, чтобы этот файл сжимал файл после перезагрузки/отправки сигнала HUP приложения.

/var/log/myapp.log {
    rotate 7
    size 500M
    compress
    weekly
    postrotate
        /bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

Это уже случай, когда сжатие происходит после постротата (что было бы противоречивым)? Если нет, может ли кто-нибудь сказать мне, возможно ли это сделать без дополнительной команды script (вариант или какой-то трюк)?

Спасибо Томас

Ответ 1

postrotate script выполняется перед сжатием: с man-страницы для logrotate

Следующий раздел конфигурационных файлов определяет, как обрабатывать файл журнала        /Вар/Журнал/сообщения. Журнал будет проходить пять недельных ротаций до        удаляется. После того, как файл журнала был повернут (но до старого        версия журнала была сжата), команда /sbin/killall -HUP        syslogd будет выполнен.

В любом случае вы можете использовать опцию delaycompress, чтобы отложить сжатие до следующего вращения.

Ответ 2

Добавьте сюда эту информацию в случае, если кто-то еще сталкивается с этим потоком, когда на самом деле ищет способ запустить script в файле после завершения сжатия. Как было сказано выше, использование postrotate/endscript не подходит для этого. Вместо этого вы можете использовать lastaction/endscript, который отлично выполняет эту работу.

Ответ 3

В постротате script всегда выполняется сжатие до, даже если действуют общие скрипты. Поэтому Хастуркун дополнительный ответ на первый ответ неверен. Когда sharedscripts действует, единственное сжатие, выполняемое до postrotate, - это для старых несжатых журналов, которые лежали вокруг из-за задержки. Для текущих журналов сжатие всегда выполняется после, запуская postrotate script.

Ответ 4

@Hasturkun - нельзя добавить комментарий, если их репутация не выше 50.

Чтобы убедиться в том, что сделает logrotate,

  • проверьте свою конфигурацию с помощью -d: debug, которые проверяют, но не делают ничего, и -f: заставить его запускать
  • или вы можете выполнить logrotate с помощью -v подробный флаг

С конфигурацией, которая использует sharedscript для postrotate

$ logrotate -d -f <logrotate.conf file>

Показывает следующие шаги:

rotating pattern: /tmp/log/messages /tmp/log/maillog /tmp/log/cron
...
renaming /tmp/log/messages to /tmp/log/messages.1
renaming /tmp/log/maillog to /tmp/log/maillog.1
renaming /tmp/log/cron to /tmp/log/cron.1
running postrotate script
<kill-hup-script executed here>
compressing log with: /bin/gzip
compressing log with: /bin/gzip
compressing log with: /bin/gzip