Archivierung Log Dateien

N

Noobi

Jungspund
Hi,
ich brauch eure Hilfe.

Aufgabe:

Einen Job schreiben der Dateien aus dem jeweils angegebenem Verzeichnis in eine komprimierte Achivdatei (tar, gezippt) verschiebt

Er soll die Dateien im Verzeichnis berücksichtigen die bis zur letzten vollen Stunde erstellt wurden

Die Archivdatei soll in das angegebene Archivverzeichnis verschoben werden

Der Name der Archivdatei soll aus Dautm und Zeitstempel plus Endung gem. nachfolgendem Format aufgebaut sein. Als Zeitstempel soll die letzte volle Stunde verwendet werden.
JJJMMTT_HHMMSSS.Endung

Bsp:

Quellverzeichnis mit Logdateien:

........./logs

Zielverzeichnis mit Archivdateien:

......../logs_archiv




Ich hoffe ihr könnt mir weiterhelfen.

Viele Dank im Vorraus
 
Hallo,

spontan würde ich sagen logrotate ist dein freund, der werkelt aber glaube ich mit täglich als kleinstem Zeitraum und versteht darunter wirklich das er die Logs einmal am Tag rotiert.

So wirst du dir etwas im Sinne von
Code:
find /pfad/zu/den/logs -mtime 1 -exec script_zum_zipen_verschieben '{}' \;
einfallen lassen müssen, mit dem "-mtime" bin ich mir grade nicht ganz sicher.

Und das ganze Stündlich als Cron laufen lassen müssen.
 
Ich dachte eher an ein kleines skript das erst alle Dateien rausfiltert die in der letzten vollen stunde erstellt wurden (vllt irgendwie mit ls -ltr....??) und dann die dateien archiviert zipt und mit richtigem namen in das archivverzeichnis schiebt.
 
Ich dachte eher an ein kleines skript das erst alle Dateien rausfiltert die in der letzten vollen stunde erstellt wurden (vllt irgendwie mit ls -ltr....??)
das sollte das find-Kommando erledigen oder willst du ernsthaft die Ausgabe von ls parsen?

und dann die dateien archiviert zipt und mit richtigem namen in das archivverzeichnis schiebt.
Den Teil hab ich dem "script_zum_zipen_verschieben" zugedacht, welches als Parameter die zubearbeitende Datei übergeben bekommt.

Nebenbei noch ne kleine Verständnisfrage meinerseits.
Die Applikation welche die Logfiles erzeugt fängt auch jede Stunde ein neues an?

Und es ist als Aufrufparameter von find "-mtime +1" für alles an Dateien, die vor einer Stunde modifiziert wurden. Falls du Angst hast das die Zipper- und Kopiererrei zu lange dauert, kannst du ja auch erst eine Liste der zu archivierenden Dateien erzeugen und diese dann abarbeiten.
 
ok dann ist das ja in ordnung mit dem find.

Die Logdateien werden in unregelmäßigen Intervallen weggeschrieben, machmal keine und machmal viele in einer Stunde.

Das Parameter "-mtime +1" ist das sicher für die letzte Stunde??
Und wie bekomme ich die Benennung der Archivdateien mit dem Zeitstempel etc hin?

Vielen Dank
 
"-mtime +1" sollte alles finden was älter als eine Stunde ist.
Ältere Dateien dürften ja eigentlich nicht vorhanden sein, da sie jede Stunde weggezippt werden.

Über eine formatierungs Optionen für den Befehl "date" (man date für mehr Infos) -> date +%Y%m%d_%H%M%S
und dann entsprechen beim Verschieben an den Dateinamen gehängt
 
ok aber jetzt würde er ja alle dateien nehmen die in der letztesn stunde erstellt wurden aber der job soll ja die Dateien im Verzeichnis berücksichtigen die bis zur letzten vollen Stunde erstellt wurden.
Das skript soll später um 01.15, 09.15, 12.15, 15.15, 18.15, 21.15 und 23.15 durchlaufen.
 
Hi,

so als Schnellschuss (ungetestet) könnte das etwa wie folgt laufen:

Code:
#!/bin/sh

LOGDIR=.../logs
ARCHDIR=.../logs_arch


TIMESTAMP=/tmp/TIMESTAMP.$$

cleanup() { rm -f $TIMESTAMP; }
trap cleanup 0


DAY=$(date '+%Y-%m-%d')
HOUR=$(date '+%H:00:00')

touch -d "$DAY $HOUR" $TIMESTAMP
# ls -l $TIMESTAMP

LOGS=$(cd $LOGDIR 2>/dev/null && find . ! -newer $TIMESTAMP -print)
[ "$LOGS" ] || { echo "Nothing to do."; exit 0; }

ARCH="${DAY}_${HOUR}.tgz"
# echo $ARCH

( cd $LOGDIR; tar --remove-files -cvzf "$ARCH" $LOGS )

exit 0

Du erzeugst also zunächst einmal eine TIMESTAMP Datei mit einem Pseudo-Erstellungsdatum von der letzten vollen Stunde (und sorgst mit der cleanup-Funktion dafür, dass die nicht bis in alle Ewigkeit stehenbleibt), checkst dann im Log-Verzeichnis ab, ob irgendwelche Dateien zu archivieren sind (d.h. ob es Dateien gibt, die älter sind als das eben angelegte TIMESTAMP File), und überlässt es ggf. "tar", die Dateien zu archivieren und im Erfolgsfall zu löschen ...

(Den "find" kannst du ggf. noch mit den maxdepth- oder prune- Optionen einschränken, damit der nicht in irgendwelche Unterverzeichnisse reinläuft, wenn das nicht gewünscht sein sollte.)

Grüsse,
A.

(Und nur am Rande, auf meiner Linux-Kiste liefert "-mtime +1" alle Dateien, die in den letzten 24 Stunden nicht modifiziert wurden; "-mmin 60" würde Dateien listen, die älter als eine Stunde sind, aber wenn du gegen die volle Stunde prüfen willst, dürfte das Timestamp-File die einfachste Lösung sein, wenn du nicht mit "find ... -mmin +$(date '%m')" oder so etwas rumspielen willst ...)
 
Zuletzt bearbeitet:
Moin,

(Und nur am Rande, auf meiner Linux-Kiste liefert "-mtime +1" alle Dateien, die in den letzten 24 Stunden nicht modifiziert wurden; "-mmin 60" würde Dateien listen, die älter als eine Stunde sind, aber wenn du gegen die volle Stunde prüfen willst, dürfte das Timestamp-File die einfachste Lösung sein, wenn du nicht mit "find ... -mmin +$(date '%m')" oder so etwas rumspielen willst ...)

Okay mit dem "-mtime" lag ich wohl daneben.
Was mich nur grade ein bisschen verwundert ist:
Code:
# findet nichts
erich@atlantis:~/scriptEcke/tmp$ find /home/erich/scriptEcke/tmp/ -mmin 60 -exec ls -l '{}' \;
# findet sie, nur warum doppelt?
erich@atlantis:~/scriptEcke/tmp$ find /home/erich/scriptEcke/tmp/ -mmin +60 -exec ls -l '{}' \;
insgesamt 12
-rw-r--r-- 1 erich erich 30 26. Mai 15:05 1.log
-rw-r--r-- 1 erich erich 30 26. Mai 15:06 2.log
-rw-r--r-- 1 erich erich 30 26. Mai 15:07 3.log
-rw-r--r-- 1 erich erich 30 26. Mai 15:05 /home/erich/scriptEcke/tmp/1.log
-rw-r--r-- 1 erich erich 30 26. Mai 15:06 /home/erich/scriptEcke/tmp/2.log
-rw-r--r-- 1 erich erich 30 26. Mai 15:07 /home/erich/scriptEcke/tmp/3.log

# mit mtime finde ich gar nichts 
erich@atlantis:~/scriptEcke/tmp$ find /home/erich/scriptEcke/tmp/ -mtime 1 -exec ls -l '{}' \;
erich@atlantis:~/scriptEcke/tmp$ find /home/erich/scriptEcke/tmp/ -mtime +1 -exec ls -l '{}' \;

mfg
HeadCrash
 
Hallo,
ich bin gerade in einer Schulung, werde das nacher gleich einmal ausprobieren.
Ich hoff das es klappt. Sieht gut aus.
Vielen Dank
 
Hi HeadCrash,

denke, der "find"-Befehl listet die Dinger zweimal, weil er zum einen die Dateien selbst findet (dann mit vollem Pfad), zum anderen aber stellt er fest, dass das Verzeichnis selbst auch matcht, und wenn er dann einen "ls -l" darauf ausführt, siehst du den Inhalt (dann mit Kurznamen) statt des Directories selbst. Meine Empfehlung daher: bei "find" statt "-exec ls -l {} \;" immer "-exec ls -ld {} \;".

Und "-mmin 60" sollte nur die Dateien liefern, die (ziemlich) genau vor 60 Minuten, nicht vorher und nicht nachher geändert wurden ... das dürften meistens nur ziemlich wenige sein ;-)

Deine Logs wurden scheinbar alle gestern nachmittag erzeugt, sind also noch keine 24 Stunden alt. Daher liefert weder "-mtime 1" noch "-mtime +1" was zurück. Schon mal mit "-mtime 0" oder "-mtime -1" probiert?

@Noobi:

wenn du das Skript oben ausprobieren willst, solltest du natürlich dann beim find-Befehl auch z.B. mit "-type f" sicherstellen, dass da nicht irrtümlich zuviel (Verzeichnisse) erwischt wird.

Grüsse
 
Zuletzt bearbeitet:
Argh, stimmt ist die Auflistung für das Verzeichnis ... danke, wieder was gelernt.

Letzt endlich find ich deinen Ansatz aber richtiger als meinen. Und das "touch -d" werd ich mir auch mal merken.

Nur wieso das "-time +1" nichts findet versteh ich immer noch nicht ganz

===Edit===
man time
...
-mtime N
der Inhalt der Datei wurde vor N*24 Stunden verändert
...

wer lesen kann ...
===/Edit===

mfg
HeadCrash

PS: Das "-mmin 60" ging auf deinen Post zurück
"-mmin 60" würde Dateien listen, die älter als eine Stunde sind
 
Zuletzt bearbeitet:
Sorry, das "-mmin 60" war da ein Typo; ich denke manchmal schneller, als ich tippe ... oder auch umgekehrt ...

A.
 
Archiveskript.sh: syntax error at line 11: `DAY=$' unexpected

die Fehlermeldung kommt wenn ich das Skript ausführen will.

#!/bin/sh

LOGDIR=/home/robin/skript/logs
ARCHDIR=/home/robin/skript/logs_archive

TIMESTAMP=/tmp/TIMESTAMP.$$

cleanup() { rm -f $TIMESTAMP; }
trap cleanup 0

DAY=$(date '+%Y-%m-%d')
HOUR=$(date '+%H:00:00')

touch -d "$DAY $HOUR" $TIMESTAMP
# ls -l $TIMESTAMP

LOGS=$(cd $LOGDIR 2>/dev/null && find . ! -newer $TIMESTAMP -print)
[ "$LOGS" ] || { echo "Nothing to do. "; exit 0; }

ARCH="{DAY}_${HOUR}.tar"
# echo $ARCH

( cd $LOGDIR; tar --remove-files -cvzf "$ARCH" $LOGS )

exit 0
 
Welches Betriebssystem und welche Shell verwendest du?

A.
 
Sehe den Fehler nicht sofort; irgendwelche nicht druckbaren Zeichen drin? Könntest du mal das Skript mit "sh -x ..." ausühren und den Output posten?

A.

(NB: Was ist /bin/sh bei dir? Bash oder alte Bourne Shell? Sollte aufgrund der #!-Zeile irgendetwas altes, Original-Bourne-kompatibles gestartet werden, dann würde das natürlich die $()-Schreibweise nicht verstehen; dann müsste man entweder auf die Backticks (`) umschreiben, oder einfach mal in der ersten Zeile /bin/sh auf den korrekten Pfad der Bash ändern ...
 
Zuletzt bearbeitet:
Zurück
Oben