Logrotate: Поворот файлів без журналу?


17

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

Чи можу я використовувати логротат для цього? Вони не є файлами журналів і вже стиснуті. Вони знаходяться в / root, а не в / var / log - чи можу я все-таки ним користуватися?

Спасибі

Відповіді:


3

Logrotate обертає файли, тож відповідь "так" - ймовірно, і якщо немає достатніх дозволів, то розмістіть їх у / резервному копіюванні чи щось. Перевірте, яку групу та користувач мають обернені журнали :-).

Існують варіанти стиснення в логротаті, наприклад, якщо "стиснути" НЕ налаштовано - ну тоді він не спробує. Також у вашому випадку варіант "повернути 5".

Погляньте в /etc/logrotate.d (або де він зберігається у вашій системі)


26

Без змін у вашому процесі логратування самостійно не буде робити те, що ви шукаєте тут. Ключова проблема тут полягає в тому, що, хоча 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 - якщо файл, який ми хочемо повернути, немає, не хвилюйтеся про це і рухайтеся далі (за замовчуванням - помилка)

Сподіваюся, це допомагає!


1
Хороша робота. Я дізнався пару речей, прочитавши це. Я хочу додати, що деякі дистрибутиви, зокрема RedHat EL, прагнуть викреслити варіанти, які не є "Enterprise Ready", так що YMMV.
нульовий час

Відповідно до цього рішення stackoverflow.com/questions/14858752/… логротат може виконати це завдання.
Пітер

22

Вам не потрібно використовувати логротат для цього. Просто використовуйте таку команду:

ls -1 /root/backup_* | sort -r | tail -n +6 | xargs rm > /dev/null 2>&1

Ця команда залишить останні 5 файлів і видалить решту (якщо такі є). Ви можете використовувати його в роботі cron.


але це не обертається ....
simpleuser

Не відповідає на запитання.
kubanczyk

4
Питання полягало в тому, щоб зберегти п'ять останніх резервних копій, і це саме так. Ще простіше: ls -t1 / root / backup_ * | хвіст -n +6 | xargs rm -f
yoyoma2

Це відповіло на моє запитання. На жаль, первісне питання було найближчим, що я міг знайти з Google-фу.
Сукіма

0

У мене просто була така ж ситуація. Logrotate звучить досить круто, але це не спрацювало для мене на 100%, оскільки воно не відповідало даним та іменам файлів.

Отже, щоб уникнути плутанини, я вирішив включити наступний рядок для виконання після створення моєї поточної резервної копії, щоб зберегти останні 5 резервних копій.

Мої журнали - це:

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

Новий рядок у моєму резервному скрипті (на основі коментаря вище)

  • знайти / BCX / dumpsql / -тип f | сортувати -р | хвіст -n +6 | xargs rm

З повагою,


-1

Ви можете обертати його вручну.

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

1
Можливо, ви можете докласти трохи зусиль для форматування своєї публікації, якщо ви хочете, щоб вона була корисною.
Тім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.