Назад | Перейти на главную страницу

Logrotate: вращение файлов, не являющихся журналами?

У меня есть сценарий резервного копирования, который сжимает различные файлы и каталоги и создает архивы .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 резервных копий.

Мои журналы:

  • tbl-bcx-20180308_010501.tar.bz2
  • tbl-bcx-20180307_010501.tar.bz2
  • tbl-bcx-20180306_010501.tar.bz2

Новая строка в моем сценарии резервного копирования (на основе комментария выше)

  • find / BCX / dumpsql / -type f | sort -r | хвост -n +6 | xargs rm

С Уважением,

Вы можете повернуть его вручную.

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!"