Logrotate. Postrotate скрипт и имя файла

в 13:09, , рубрики: linux, variable, переменные, системное администрирование, метки: ,

Думаю что нет *nix-админа, который не пользуется утилитой logrotate. Часто мы пользуемся ею, даже не подозревая что она установлена в системе. Однако, когда мне понадобилось пропарсить проротейченный log-файл, я был крайне удивлен.

Итак, задача проста как пятак поросенка, а встречается куда как чаще. Надо пропарсить лог после ротации. Допустим у нас текстовый лог squid'a лежащий в /var/log/squid. Имеем /etc/logrotate.d/squid следующего содержания:

/var/log/squid/*.log {
    daily
    missingok
    rotate 8
    compress
    copytruncate
    delaycompress
    notifempty
    nocreate
    sharedscripts
    postrotate
        /etc/init.d/squid reload > /dev/null
    endscript
}

То есть ротейтим лог файл раз в день, после ротации перезапускаем squid, свежепроротейченный файл не жмем. Напрашивается очевидное решение — добавить в postrotate вызов нашего обработчика, примерно так:

    postrotate
        /etc/init.d/squid reload > /dev/null
        /где-то-там/sq_control/manage.py squid --load-log $FILENAME
    endscript

Однако не тут-то было. В манах ничего про перееменные в pre/postrotate не сказано. Совсем ничего. Как будто их нет и никому они не нужны. Гугление тоже не дало каких либо ощутимых результатов. Однако методом тыка было выяснено, что переменная $1 содержит имя файла. Правда не то, которое получается после ротации, а то, что подходит под маску. В нашем случае /var/log/squid/access.log — не то что нужно, но тоже хлеб. Зная, что logrotate стандартно добавляет суффикс -YYYYMMDD и имея под рукой sed получаем:

    postrotate
        /etc/init.d/squid reload > /dev/null
        fffn=$1"-"`date '+%Y%m%d'`
        fffn=`echo "$fffn" | sed -r 's/s+//g'`
        /где-то-там/sq_control/manage.py squid --load-log $fffn
    endscript

Если есть решение лучше — делитесь и критикуйте.

Автор: xenolog

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js