Цель «postrotate invoke-rc.d rsyslog rotate» при журналировании, и является ли эта команда устаревшей?

При использовании logrotate для поддержания вращения файлов журнала я видел

postrotate
                invoke-rc.d rsyslog rotate > /dev/null
endscript

, я знаю, что postrotate заставляет bash выполнить следующую команду после поворота файла журнала, но какова цель этой команды выполняется точно?

Наконец, это уже устарело? (Кажется, я вижу сообщение из anacron, в котором говорится: «Сценарий, который вы пытаетесь вызвать, был преобразован в задание Upstart, но поворот не поддерживается для заданий Upstart».)

3
задан 12 January 2014 в 17:35

2 ответа

У меня была похожая проблема, и похоже, что конфигурация 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
0
ответ дан 12 January 2014 в 17:35

Цель команды - заставить 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». Надеюсь, это поможет.

0
ответ дан 12 January 2014 в 17:35

Другие вопросы по тегам:

Похожие вопросы: