При использовании logrotate для поддержания вращения файлов журнала я видел
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
, я знаю, что postrotate
заставляет bash выполнить следующую команду после поворота файла журнала, но какова цель этой команды выполняется точно?
Наконец, это уже устарело? (Кажется, я вижу сообщение из anacron
, в котором говорится: «Сценарий, который вы пытаетесь вызвать, был преобразован в задание Upstart, но поворот не поддерживается для заданий Upstart».)
У меня была похожая проблема, и похоже, что конфигурация rsyslog для logrotate не работает, поэтому вместо вызова service rsyslog rotate
, который действительно работает, он использует reload rsyslog
или подобное. Оказывается, это было на самом деле ошибка , которая была исправлена в версии 7.4.4-1ubuntu5 , но моя установка Ubuntu 14.04 видит только версию 7.4.4-1ubuntu2 в кв.
Это исправление, которое сработало для меня:
Отредактируйте файл /etc/logrotate.d/rsyslog
, заменив строку внутри блока postrotate
(например, reload rsyslog
или invoke-rc.d rsyslog rotate
) следующим:
service rsyslog rotate >/dev/null 2>&1 || true
Вот как должен выглядеть блок:
postrotate
service rsyslog rotate >/dev/null 2>&1 || true
endscript
Со всеми окружающими линиями, оставленными как есть.
В качестве последнего шага было бы неплохо выполнить команду один раз вручную:
service rsyslog rotate
Цель команды - заставить rsyslog заново открыть файлы, которые он использует для записи журналов. Он используется после того, как logrotate перемещает старые файлы, поэтому rsyslog начинает запись в новые.
Пример: rsyslog записывает большинство своих вещей в / var / log / syslog. Когда запускается logrotate, он перемещает этот файл в /var/log/syslog.1 и создает новый пустой / var / log / syslog. Но, как вы, вероятно, знаете (но на всякий случай), rsyslog не записывает в файл с именем / var / log / syslog, а в дескриптор файла, который он получил при первом открытии файла. Вы можете перемещаться по связанному файлу, и rsyslog будет продолжать писать в него, потому что он знает только о дескрипторе файла. Когда вы перемещаете / var / log / syslog в /var/log/syslog.1, rsyslog будет продолжать писать в /var/log/syslog.1, потому что именно на это указывает его файловый дескриптор. Фактически, вы можете даже удалить файл, и rsyslog продолжит запись. Вот что происходит, когда файлы, которые удаляются, занимают место: дескрипторы файлов все еще открыты, и поэтому пространство не освобождается. Это происходит только тогда, когда закрыта последняя ссылка на файл.
Аргумент «rotate» предназначен для принудительного освобождения старых файловых дескрипторов и для указания rsyslog, что он должен снова открыть файлы, чтобы он получал новые файловые дескрипторы для новых файлов, и старые могут быть должным образом удалены .
Что касается устаревания, боюсь, я не знаю. Вот что привело меня к вашему вопросу O :-) Но я считаю, что проблема в том, что выскочивший конфиг не готов принять эту опцию. Я заменил это на странице руководства:
kill -HUP $(cat /var/run/rsyslogd.pid)
Что в любом случае сделал «rotate». Надеюсь, это поможет.