27.5. Сценарий logroll
27.5. Сценарий logroll
Некоторые системные журнальные файлы увеличиваются довольно быстро. Становится затруднительным вручную уточнять размеры журнальных файлов и выполнять прокрутку определенного журнала (обычно, с помощью отметки даты). Поэтому назрела необходимость создания сценария для автоматизации этой процедуры. Сценарий выполняется с помощью утилиты cron, и если какой?либо журнальный файл достигает определенного размера, осуществляется прокрутка данного журнала и создание нового журнального файла.
Этот сценарий может быть легко обновлен для работы с иными журнальными файлами. Например, при обработке системных журнальных файлов можно применить другой сценарий, который выполняется еженедельно и усекает журнальные файлы. Если необходимо просмотреть более ранние сообщения, нужно проверить резервную копию; при работе в 16–недельном цикле это нетрудно.
Ограничение размера устанавливается с помощью переменной BLOCKLIMIT. Эта переменная указывает размер блока, который в данном случае равен восьми и соответствует 4 Кб, При необходимости можно установить большее значение. Информация обо всех журнальных файлах, подлежащих проверке, хранится с помощью переменной logs.
Затем с помощью этой переменной и цикла for выполняется проверка каждого журнального файла. Применяя команду du, можно оценить размер журнального файла. Если размер файла превышает значение blocklimit, журнальный файл копируется и с добавлением временной метки присоединяется к этому файлу. Затем исходный файл обнуляется, и изменяются права владения на группу файлов.
Сценарий выполняется с помощью утилиты cron два раза в неделю; при этом создается резервная копия файла с указанием временной метки. Поэтому при возникновении проблем можно быстро отследить выполненные действия.
$ pg logroll
#!/bin/sh
#logroll
#усечение журнальных файлов, размеры которых более MARK
#может использовать и для почтовых ящиков?
#максимальный размер журнального файла 4096 к
BLOCK_LIMIT=8
MYDATE=`date +%d%m`
# список журнальных файлов для проверки…ваш список может быть другим!
LOGS="/var/spool/audlog /var/spool/networks/netlog /etc/dns/named_log"
for LOG_FILE in $LOGS
do
if [ -f $LOG_FILE ]; then.
# определение размера блока
F_SIZE=`du -a $LOG_FILE | cut -f1`
else
echo "`basename $0` cannot find $LOG_FILE" >&2
#можно выйти здесь, но следует убедиться, что проверены все
#журнальные файлы
continue
fi
if [ "$F_SIZE" -gt "$BLOCK_LIMIT" ]; then
#копирование журнального файла и присоединение к нему даты в формате ddmm
cp $LOG_FILE $LOG_FILE$MYDATE
#создание нового пустого журнального файла
>$LOG_FILE
chgrp admin $LOG_FILE$MYDATE
fi
done