Bash Backupscript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
JonasE
Beiträge: 26
Registriert: 04.10.2010 18:43:29

Bash Backupscript

Beitrag von JonasE » 03.11.2010 11:17:57

Hallo,
ich habe ein Problem. Ich habe einen Script geschrieben, der mir meine Systeminformationen protokolliert.
Jeden Tag und bei jeder Anmeldung.
Jetzt betreibe ich das Script seit über einem Monat. Ich habe langsam zu viele Verzeichnisse und es wird unübersichtlich. Deswegen möchte ich, das sich immer am Monatsanfang alle Alten "loggs" in eine ".tar.gz" Datei verkrümeln.
Ich habe eine Variable, die das Aktuelle Datum angibt.
Das Script könnt ihr Hier einsehen.

Benutzeravatar
daFreak
Beiträge: 875
Registriert: 14.09.2005 12:09:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash Backupscript

Beitrag von daFreak » 03.11.2010 12:07:38

Hallo,

ich konnte zwar das Problem nicht klar aus deinem Post erkennen, aber ich schätze, das es um die Archivierung der Logfiles geht.
Wenn dem so ist, wäre wahrscheinlich logrotate deine gesuchte Lösung.

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Bash Backupscript

Beitrag von gbotti » 03.11.2010 12:29:30

Hi.

Wenn ich dein Script richtig gelesen habe schreibst Du ja deine Log's in die Unterordner "$parentdir/system/".
Da hilft Logrotate nicht wirklich oder? Bitte belehrt mich, falls ich das falsch in Erinnerung hab. Logrotate kann man Super mit einzelnen Logdateien verwenden.

Da Du das ja jeden Monat machen möchtest gibt es in dem Ordner (vermutlich) immer nur Dateien und Ordner aus dem letzten Monat.

Wenn Du am Anfang deines Scripts einbaust, dass er prüfen soll, ob es in dem Ordner Dateien aus dem letzten Monat gibt, diese dann mit tar wegschreibst und löscht bevor dein eigentliches Script läuft sollte das doch klappen. Beispiel:

Code: Alles auswählen

#!/bin/bash
parentdir=/root/parent
date=$(date "+%d-%m-%Y")
LMFILESEXIST=0
let LASTMONTH=$(date +%m)-1
DIRECTORIES=$(find $parentdir/system/ -type d ! -iname '.' -printf '%Tm\n')
for DIRECTORY in $DIRECTORIES
do
    if [ $DIRECTORY -eq $LASTMONTH ]; then
      LMFILESEXIST=1
    fi
done
if [ $LMFILESEXIST == 1 ]; then
    cd $parentdir/system/
    DIRS=$(find . -type d ! -iname '.' -printf '%p\n')
    if tar -cWf $parentdir/archive/logarchive-$LASTMONTH-$date.tar $DIRS
    then
       if bzip2 $parentdir/archive/logarchive-$LASTMONTH-$date.tar ; then
           if rm -rf $DIRS ; then
              echo "Archiv $parentdir/archive/logarchive-$LASTMONTH-$date.tar.bz2 wurde erstellt und Originaldateien aus Monat $LASTMONTH geloescht"
          fi
       fi
    fi
fi
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

JonasE
Beiträge: 26
Registriert: 04.10.2010 18:43:29

Re: Bash Backupscript

Beitrag von JonasE » 03.11.2010 16:39:18

Hallo,
danke für eure Antworten.
Ich hatte die Idee, wie oben schon gesagt, das jeden neu Angefangenen Monat alle anderen Verzeichnisse in z.B. "$HOME/.backup" zu schieben. Wenn das mit "if" zu realisieren wäre, würde ich das sehr gut finden.

Also:

Code: Alles auswählen

if $date = #(new month?)
then
.....

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Bash Backupscript

Beitrag von gbotti » 03.11.2010 16:54:01

Du hast nicht wirklich verstanden was ich in meinem Script vorgeschlagen habe?

Da kommen so Sachen wie:

Code: Alles auswählen

let LASTMONTH=$(date +%m)-1
vor. Wenn ich richtig gezählt habe sind da sogar insgesamt 5 if-Abfragen drin...
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

JonasE
Beiträge: 26
Registriert: 04.10.2010 18:43:29

Re: Bash Backupscript

Beitrag von JonasE » 03.11.2010 21:59:01

Code: Alles auswählen

#!/bin/bash
parentdir=/root/parent #Wozu wird die Variable neu Definiert?
date=$(date "+%d-%m-%Y") #Wozu wird die Variable neu Definiert?
LMFILESEXIST=0
let LASTMONTH=$(date +%m)-1 #Was macht "let"? 
DIRECTORIES=$(find $parentdir/system/ -type d ! -iname '.' -printf '%Tm\n') #Könnte mir das hier auch jemand erklären?
for DIRECTORY in $DIRECTORIES
do
    if [ $DIRECTORY -eq $LASTMONTH ]; then
      LMFILESEXIST=1
    fi
done
if [ $LMFILESEXIST == 1 ]; then
    cd $parentdir/system/
    DIRS=$(find . -type d ! -iname '.' -printf '%p\n')
    if tar -cWf $parentdir/archive/logarchive-$LASTMONTH-$date.tar $DIRS
    then
       if bzip2 $parentdir/archive/logarchive-$LASTMONTH-$date.tar ; then
           if rm -rf $DIRS ; then
              echo "Archiv $parentdir/archive/logarchive-$LASTMONTH-$date.tar.bz2 wurde erstellt und Originaldateien aus Monat $LASTMONTH geloescht" #Das ganze läuft als Autostart unter Gnome, also ohne sichtbare Konsole.

          fi
       fi
    fi
fi
Tut mir leid, das ich so viele Fragen habe, aber ich bin nicht ganz so Fitt auf dem Gebiet.

dawg
Beiträge: 441
Registriert: 29.12.2008 19:59:00

Re: Bash Backupscript

Beitrag von dawg » 04.11.2010 02:52:41

JonasE hat geschrieben:Hallo,
danke für eure Antworten.
Ich hatte die Idee, wie oben schon gesagt, das jeden neu Angefangenen Monat alle anderen Verzeichnisse in z.B. "$HOME/.backup" zu schieben. Wenn das mit "if" zu realisieren wäre, würde ich das sehr gut finden.

Also:

Code: Alles auswählen

if $date = #(new month?)
then
.....

Code: Alles auswählen

$ if [[ $(date +%d) -eq 01 ]] ; then echo "do it, but replace echo with the tar command" ; fi
Vielleicht, vielleicht nicht. Auf jeden Fall ein kiss.
Anstelle des "echo" zB:

Code: Alles auswählen

mkdir name_of_backup 
mv *file_names name_of_backup 
tar -czf name_of_backup.tar.gz name_of_backup
rm -r name_of backup
und ein paar tests, damit nix gelöscht wird wenn was schief geht (zB mit && oder last-exit-status: $?)

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Bash Backupscript

Beitrag von gbotti » 04.11.2010 09:01:34

JonasE hat geschrieben:

Code: Alles auswählen

parentdir=/root/parent #Wozu wird die Variable neu Definiert?
date=$(date "+%d-%m-%Y") #Wozu wird die Variable neu Definiert?
let LASTMONTH=$(date +%m)-1 #Was macht "let"? 
DIRECTORIES=$(find $parentdir/system/ -type d ! -iname '.' -printf '%Tm\n') #Könnte mir das hier auch jemand erklären?
              echo "Archiv $parentdir/archive/logarchive-$LASTMONTH-$date.tar.bz2 wurde erstellt und Originaldateien aus Monat $LASTMONTH geloescht" #Das ganze läuft als Autostart unter Gnome, also ohne sichtbare Konsole.
Tut mir leid, das ich so viele Fragen habe, aber ich bin nicht ganz so Fitt auf dem Gebiet.
Also. Das was Du in meinem ersten Posting siehst ist ein komplett lauffähiges Script, dass Eigenständig läuft. Ich musste die Variablen darin definieren, weil ich Dein Script nicht angepasst habe, da es bei mir vermutlich eh nicht laufen würde. In Dein Script solltest Du dir also nur die noch nicht gesetzten Variablen einbauen.

"let" führt Aktionen aus. In diesem Fall eine Berechnung. $(date +%m) gibt den aktuellen Monat aus (Jetzt 11), davon wird 1 abgezogen (-1). LASTMONTH würde also im November mit dem Wert 10 gefüllt.
DIRECTORIES. In Deinem Ordner $parentdir/system/ soll mit find nach Ordnern gesucht werden (-type d) die im Namen nicht "." enthalten (-iname '.'). Von den gefundenen Ordnern soll nur der Monat ausgegeben werden (-print '%Tm\n').
Das echo hab ich als Beispiel eingebaut. Du solltest Dir vielleicht eine Log-Datei einbauen, in der Fehlermeldungen und normale Meldungen auflaufen, dann kann man auch nachvollziehen ob Dein Script lief.

Das kann man aber auch direkt beim Befehlsaufruf machen:

Code: Alles auswählen

/hier/ist/meinscript.sh 1>>LOGDATEI1 2>>ERRORLOG
Dann klappts auch mit dem echo ;)

Code: Alles auswählen

$ if [[ $(date +%d) -eq 01 ]] ; then echo "do it, but replace echo with the tar command" ; fi
Das find ich generell ne gute Idee, nur läuft das nicht, wenn der PC mal am 1. nicht eingeschaltet wird, da nur geprüft wird, ob heute der erste ist.

Außerdem kann man mit den if-Abfragen relativ einfach rausfinden, ob der Befehl erfolgreich war, der gerade ausgeführt wurde. Erst dann wird rm ausgeführt:

Code: Alles auswählen

if tar -cWf $parentdir/archive/logarchive-$LASTMONTH-$date.tar $DIRS # Wenn tar erfolgreich war und die gepackten Dateien getestet wurden (Parameter W)....
    then # Dann
       if bzip2 $parentdir/archive/logarchive-$LASTMONTH-$date.tar ; then # Pack diese Datei zu ner bzip2 und wenn das erfolgreich war...
           if rm -rf $DIRS ; then # dann lösche die Ursprungsordner und...
              echo "Archiv $parentdir/archive/logarchive-$LASTMONTH-$date.tar.bz2 wurde erstellt und Originaldateien aus Monat $LASTMONTH geloescht" # gib mir ne Meldung, dass es geklappt hat
          fi
       fi
    fi
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

dawg
Beiträge: 441
Registriert: 29.12.2008 19:59:00

Re: Bash Backupscript

Beitrag von dawg » 04.11.2010 13:42:20

Dass der Test über "date -%d = 01" nur "funktioniert" wenn der PC am Ersten eingeschaltet ist habe ich tatsächlich übersehen. Verdammich, aber vielen Dank für die Korrektur, bzw den Hinweis.

gbotti
Beiträge: 846
Registriert: 16.07.2010 14:24:43
Wohnort: München

Re: Bash Backupscript

Beitrag von gbotti » 04.11.2010 13:48:46

dawg hat geschrieben:... Verdammich, aber vielen Dank für die Korrektur, bzw den Hinweis.
Nö. Dafür wird keiner Verdammt. Und: Nix zu danken. Ich mach bestimmt auch manche Sachen, die man besser machen kann!
Georg
RTFM, LMGTFY, Orakel... Ach... Warum muss man suchen...
Schrödingers Backup --- "Der Zustand eines Backups ist unbekannt, solange man es nicht wiederherstellt" --- Quelle: Nixcraft

JonasE
Beiträge: 26
Registriert: 04.10.2010 18:43:29

Re: Bash Backupscript

Beitrag von JonasE » 05.11.2010 08:11:47

Wow, danke an alle. Ich werde sofort mal die/den Script/Scripte ausprobieren.

Vielen Danke und Liebe Grüße

Jonas

JonasE
Beiträge: 26
Registriert: 04.10.2010 18:43:29

Re: Bash Backupscript

Beitrag von JonasE » 07.11.2010 20:39:35

Ich habe jetzt doch endlich eine eigene Lösung gefunden.

Code: Alles auswählen

read bup < $datadir/bup
echo $bup
let bup++
echo $bup
echo $bup > $datadir/bup

if [ $bup -eq 50 ]
then
bup=1
mv -r $parentdir/login $bupdir/login/
mv -r $parentdir/pic $bupdir/pic/
mv -r $parentdir/system $bupdir/system/
fi
echo $bup > $datadir/bup
So ist es am einfachsten und ich habe nicht zu viele Datensätze.

Danke an alle, ganz besonders an gbotti und dawg.


LG
Jonas

Antworten