Logrotate: Obracanie plików nielogowych?

17

Mam skrypt kopii zapasowej, który kompresuje różne pliki i katalogi i tworzy archiwa .tgz. Pliki są nazywane np

...
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

Chcę zarządzać tymi plikami, aby zachować tylko 5 ostatnich kopii zapasowych, a starsze pliki były usuwane.

Czy mogę użyć do tego programu Logrotate? Nie są to pliki dziennika i są już skompresowane. Są w katalogu / root, a nie w katalogu / var / log - czy nadal mogę go używać?

Dzięki

jen
źródło

Odpowiedzi:

3

Logrotate obraca pliki, więc odpowiedź brzmi tak - prawdopodobnie, a jeśli nie ma wystarczających uprawnień, umieść je w / backup lub coś. Sprawdź, jaką grupę i użytkownik mają obrócone dzienniki :-).

Istnieją opcje kompresji w logrotate, jeśli nie skonfigurowano „kompresji” - cóż, to nie będzie próbować. Również w twoim przypadku opcja „obróć 5”.

Zajrzyj do /etc/logrotate.d (lub gdziekolwiek jest on przechowywany w twoim systemie)

3molo
źródło
26

Bez zmiany procesu sam logrotate nie zrobi tego, czego tu szukasz. Kluczowym problemem jest to, że chociaż logrotate może przyjmować symbole wieloznaczne, nie będzie traktować plików jako jednego, jeśli to zrobisz, a zamiast tego spróbuje obrócić je wszystkie osobno, co zdecydowanie NIE jest tym, czego chcesz.

Możesz jednak ustawić sposób działania tak, jak to opisujesz, o ile najnowsza kopia zapasowa jest tworzona bez datownika. Jeśli proces tworzenia kopii zapasowej tworzy /root/backup.tar.gzna przykład, możesz użyć następującej konfiguracji logrotate:

/root/backup.tar.gz {
    rotate 5
    nocompress
    dateext
    dateformat _%Y-%m-%d
    extension .tar.gz
    missingok
}

Krótki przegląd dostępnych tutaj opcji:

  • rotate 5 - zachowaj 5 obrotów przed usunięciem
  • nocompress - nie kompresuj plików po obróceniu
  • dateext - użyj daty jako rozszerzenia rotacji zamiast zwiększania liczb
  • dateformat _%Y-%m-%d - ustaw format rozszerzenia daty, którego chcesz użyć
  • extension .tar.gz- .tar.gznadejdź po rozszerzeniu obrotu
  • missingok - jeśli pliku, który chcemy obrócić, nie ma, nie przejmuj się nim i przejdź dalej (domyślnie jest to błąd)

Mam nadzieję że to pomoże!

znak
źródło
1
Dobra robota. Nauczyłem się kilku rzeczy, czytając to. Chciałbym jednak dodać, że niektóre dystrybucje, zwłaszcza RedHat EL, mają tendencję do usuwania opcji, które nie są „gotowe na Enterprise”, więc YMMV.
zerolagtime
Zgodnie z tym rozwiązaniem stackoverflow.com/questions/14858752/... logrotate może wykonać zadanie.
Pieter
22

Aby to zrobić, nie musisz używać logrotate. Wystarczy użyć następującego polecenia:

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

To polecenie pozostawi ostatnie 5 plików i usunie pozostałe (jeśli istnieją). Możesz go użyć w zadaniu cron.

Khaled
źródło
ale to się nie obraca ....
simpleuser
Nie odpowiada na pytanie.
kubańczyk
4
Pytanie polegało na zachowaniu pięciu ostatnich kopii zapasowych i to właśnie to robi. Jeszcze prościej: ls -t1 / root / backup_ * | ogon -n +6 | xargs rm -f
yoyoma2
To odpowiedziało na moje pytanie. Niestety pierwotne pytanie było najbliższe, jakie mogłem znaleźć w Google-fu.
Sukima,
0

Właśnie miałem taką samą sytuację. Logrotate brzmi całkiem fajnie, ale nie działało dla mnie w 100%, ponieważ nie pasuje do danych i nazw plików.

Aby uniknąć nieporozumień, postanowiłem włączyć następujący wiersz do wykonania po utworzeniu bieżącej kopii zapasowej w celu zachowania ostatnich 5 kopii zapasowych.

Moje logi to:

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

Nowa linia do mojego skryptu zapasowego (na podstawie powyższego komentarza)

  • find / BCX / dumpsql / -type f | sort -r | ogon -n +6 | xargs rm

Pozdrowienia,

200313
źródło
-1

Możesz go obrócić ręcznie.

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_}
}

Teraz, aby umieścić dane w dzienniku, po prostu zrób

rotating_logger <file_path> "Welcome world!"
Krrish Krrish
źródło
1
Być może możesz włożyć trochę wysiłku w sformatowanie swojego postu, jeśli chcesz, aby był on użyteczny.
Tim