У меня есть сценарий резервного копирования, который сжимает различные файлы и каталоги и создает архивы .tgz. Файлы имеют имена, например
...
backup_2010-10-28.tar.gz
backup_2010-10-29.tar.gz
backup_2010-10-30.tar.gz
backup_2010-10-31.tar.gz
backup_2010-11-01.tar.gz
Я хочу управлять этими файлами, чтобы сохранялись только последние 5 резервных копий, а старые файлы удалялись.
Могу ли я использовать для этого logrotate? Это не файлы журнала, и они уже сжаты. Они находятся в / root, а не в / var / log - могу ли я использовать его?
Спасибо
Без изменения вашего процесса logrotate сам по себе не будет делать то, что вы здесь ищете. Ключевая проблема здесь в том, что, хотя logrotate может принимать подстановочные знаки, он не будет рассматривать файлы как один, если вы это сделаете, а вместо этого попытается повернуть все их по отдельности, что определенно НЕ то, что вы хотите.
Однако вы можете заставить его работать так, как вы описываете, при условии, что самая последняя резервная копия создается без отметки даты. Если вы создаете резервную копию /root/backup.tar.gz
например, вы можете использовать следующую конфигурацию logrotate:
/root/backup.tar.gz {
rotate 5
nocompress
dateext
dateformat _%Y-%m-%d
extension .tar.gz
missingok
}
Краткое изложение вариантов здесь:
rotate 5
- перед удалением оставьте 5 оборотовnocompress
- не сжимать файлы после поворотаdateext
- используйте дату в качестве расширения ротации вместо увеличения числаdateformat _%Y-%m-%d
- установите формат расширения даты, который вы хотите использоватьextension .tar.gz
-- сделать .tar.gz
прийти после расширения вращенияmissingok
- если файла, который мы хотим повернуть, нет, не беспокойтесь об этом и двигайтесь дальше (по умолчанию выдается ошибка)Надеюсь это поможет!
Для этого вам не нужно использовать logrotate. Просто используйте такую команду:
ls -1 /root/backup_* | sort -r | tail -n +6 | xargs rm > /dev/null 2>&1
Эта команда оставит 5 последних файлов и удалит оставшиеся (если есть). Вы можете использовать его в работе cron.
Logrotate вращает файлы, поэтому ответ - да - возможно, и если нет достаточных разрешений, поместите их в / backup или что-то в этом роде. Проверьте, какая группа и пользователь имеют повернутые журналы :-).
В logrotate есть параметры для сжатия, так что если "compress" НЕ настроен - ну, тогда он не будет пытаться. Также в вашем случае вариант «повернуть на 5».
Загляните в /etc/logrotate.d (или там, где он хранится в вашей системе)
У меня была такая же ситуация. Logrotate звучит довольно круто, но у меня он не сработал на 100%, потому что он не соответствует данным и именам файлов.
Итак, чтобы избежать путаницы, я решил включить следующую строку для выполнения после создания моей текущей резервной копии, чтобы сохранить последние 5 резервных копий.
Мои журналы:
Новая строка в моем сценарии резервного копирования (на основе комментария выше)
С Уважением,
Вы можете повернуть его вручную.
rotating_logger()
{
_LOG_FILE_=${1}
_MESSAGE_TO_ECHO_=${2}
_LOG_FILE_BYTES_SIZE_=`wc -c ${_LOG_FILE_} | awk '{print $1}'`
#echo "_LOG_FILE_BYTES_SIZE_ : ${_LOG_FILE_BYTES_SIZE_}"
# in MB
if [ ${_LOG_FILE_BYTES_SIZE_} -gt ${_FILE_SIZE_IN_BYTES_} ] ; then
#cat /dev/null > ${_LOG_FILE_}
for (( i=${_LOG_ROTATE_MAX_INDEX_}; i>=1; i-- ))
do
if [ $i -eq ${_LOG_ROTATE_MAX_INDEX_} -a -f ${_LOG_FILE_}.$i ] ; then
rm -rf ${_LOG_FILE_}.$i
fi
if [ $i -gt 10 ] ; then
rm -rf ${_LOG_FILE_}.10
elif [ $i -eq 9 -a -f ${_LOG_FILE_}.9 ] ; then
mv ${_LOG_FILE_}.9 ${_LOG_FILE_}.10
elif [ $i -eq 8 -a -f ${_LOG_FILE_}.8 ] ; then
mv ${_LOG_FILE_}.8 ${_LOG_FILE_}.9
elif [ $i -eq 7 -a -f ${_LOG_FILE_}.7 ] ; then
mv ${_LOG_FILE_}.7 ${_LOG_FILE_}.8
elif [ $i -eq 6 -a -f ${_LOG_FILE_}.6 ] ; then
mv ${_LOG_FILE_}.6 ${_LOG_FILE_}.7
elif [ $i -eq 5 -a -f ${_LOG_FILE_}.5 ] ; then
mv ${_LOG_FILE_}.5 ${_LOG_FILE_}.6
elif [ $i -eq 4 -a -f ${_LOG_FILE_}.4 ] ; then
mv ${_LOG_FILE_}.4 ${_LOG_FILE_}.5
elif [ $i -eq 3 -a -f ${_LOG_FILE_}.3 ] ; then
mv ${_LOG_FILE_}.3 ${_LOG_FILE_}.4
elif [ $i -eq 2 -a -f ${_LOG_FILE_}.2 ] ; then
mv ${_LOG_FILE_}.2 ${_LOG_FILE_}.3
elif [ $i -eq 1 -a -f ${_LOG_FILE_}.1 ] ; then
mv ${_LOG_FILE_}.1 ${_LOG_FILE_}.2
fi
done
mv ${_LOG_FILE_} ${_LOG_FILE_}.1
touch ${_LOG_FILE_}
fi
echo `date +%Y-%m-%d:%H:%M:%S` : "${_MESSAGE_TO_ECHO_}" >> ${_LOG_FILE_}
#echo "" >> ${_LOG_FILE_}
}
Теперь, чтобы записать данные в журнал, просто выполните
rotating_logger <file_path> "Welcome world!"