Die Entwicklung eines Shell-Scripts

wilhelm.moser@demos.at  2003-07-11

Artikel download shell_script_entwicklung.zip (213 Kb)

 

Übersicht

Anhand genauer Aufzeichnungen wird der Weg von der Idee eines automatisierten Ablaufes unter Linux am Beispiel eines Sicherungsscripts des Verzeichnisses /etc  bis zur Umsetzung beschrieben.

 

Inhalt

Die Anforderung
 
Testfälle

Test 1 - Wie verhält sich tar beim einpacken wenn /home/backup schon existiert?
Test 2 -  Verzeichnis anlegen
Test 3 - Tar Archiv einpacken
Variante 1, das Datum der Erstellung des tar-archives  mitzuspeichern um Sicherungskopien zu erstellen.
Variante 2, EINE Sicherungskopie der Sicherung erstellen

Vorläufige Festlegung des Ablaufes des Shell Scripts
 
Das Shell - Script
 
Die Weiterentwicklung als inkrementielle Sicherung mit Full-Backup
 

Sicherungen über das Netzwerk zu einem entfernten Rechner
 

 
Anlagen

GNU tar: an archiver tool FTP release, version 1.12, 24 April 1997 (noch immer aktuell)
Backup - Strategien (etwas ausführlicher)
Backup/Restore per Shell-Script vom Linux Stammtisch Bremerhaven
Datensicherung mit Amanda
 

[ top ]

Die Anforderung

Wir wollen das Verzeichnis etc sichern. Was brauchen wir?

Wie soll gesichert werden? In dem das Verzeichnis in eine Datei geschrieben und gleichzeitig komprimiert wird. Befehl tar (analog zip unter Windows)
     
Programmablauf? etc in tar einpacken und im Backup-Directory ablegen. (/home/backup) 1. Ansatz !!
     
Mögliche Fehler? /etc existiert nicht Na dann hatten wir kein Linux
  Der Befehlsinterpreter sh oder bash existiert nicht. Dann könnte das Script nicht ausgeführt werden und liefert damit keine Fehler.
     
  tar existiert nicht. Das ist möglich aber tar ist bei jedem Linux-OS standardmäßig mitinstalliert.
     
  /home/backup existiert nicht Testen ob wir das automatisch anlegen können und wie.

Test Verzeichnis anlegen

     
  Selbst bei einem einfachen Fall kann die Liste ziemlich lang werden und ist auch hier bei weitem nicht abgeschlossen...  
     
     

[ top ]

Testfälle

Test 1 - Wie verhält sich tar beim einpacken wenn /home/backup schon existiert?

[root@blue home]# /bin/tar -cf /home/backup/etc.tar /etc

[root@blue home]# /bin/tar -cf /home/backup/etc.tar /etc
/bin/tar: /home/backup/etc.tar: Cannot open: No such file or directory
/bin/tar: Error is not recoverable: exiting now
[root@blue home]#

Das Verzeichnis muss also existieren -->
 

Test 2 -  Verzeichnis anlegen


mit mkdir versuchen ein Verzeichnis anzulegen wenn es schon existiert.
Legen wir zuerst das Verzeichnis neu an:


[root@blue /]# mkdir /home/backup
[root@blue /]#


Damit existiert das Verzeichnis.


Ok versuchen wir nochmals das existierenden Verzeichnis anzulegen:

[root@blue /]# mkdir /home/backup
mkdir: cannot create directory `/home/backup': File exists
[root@blue /]#
 

Fehler - Shell script steigt aus.
 

Gibt es bei mkdir parameter?


[root@blue /]# mkdir --help
Usage: mkdir [OPTION] DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.

-m, --mode=MODE set permission mode (as in chmod), not rwxrwxrwx - umask
-p, --parents no error if existing, make parent directories as needed
-v, --verbose print a message for each created directory
--help display this help and exit
--version output version information and exit

Report bugs to <bug-fileutils@gnu.org>.
[root@blue /]#


Versuch mit Parameter -p  bei existierendem Verzeichnis:

[root@blue /]# mkdir -p /home/backup
[root@blue /]#

Resultat OK - Das Verzeichnis existiert, mkdir liefert keine Meldung, also keinen Fehler.

 

Ergebnis
Wir können mit mkdir -p das Verzeichnis erstellen lassen. Existiert es passiert nichts, existiert es nicht wird es einfach angelegt.

Test 3 - Tar Archiv einpacken

Der Aufruf von tar --help zeigt, dass das Einpacken mit tar -cf archive.tar foo bar # Create archive.tar from files foo and bar. funktioniert.

-c, --create create a new archive
-f, --file=ARCHIVE use archive file or device ARCHIVE



[root@blue /]# /bin/tar -cf /home/backup/etc.tar /etc
/bin/tar: Removing leading `/' from member names
[root@blue /]#
 

Tar setzt in diesem Fall einen "relativen Pfad" und entfernt  "leading slashes" damit beim Entpacken ohne Parameter in jedem Fall in das dann aktuelle Verzeichnis entpackt wird. 'Jedenfalls wurde unser tar -Archiv eingepackt.

Sehen wir nach ob das Packen richtig erfolgte. Auf /home/backup gehen, auspacken und vergleichen.
Entpackt mit tar -xvf etc.tar in das Verzeichnis /home/backup und manuell überprüft.
Pfade und Dateien sind OK.

 

Variante 1, das Datum der Erstellung des tar-archives  mitzuspeichern um Sicherungskopien zu erstellen.


[root@blue rsync]# date +%Y-%m-%d_%H-%M-%S
2003-07-11_11-40-14
[root@blue rsync]#


ALSO SO: etc_2003-07-11_11-40-14.tar

Und die Folgen?
tar's würden nie überschrieben und wenn ein CRON-Job täglich läuft würden 365 Dateien pro Jahr erstellt werden oder wir müssten von Zeit zu Zeit das Verzeichnis warten und ältere Dateien löschen.

Und die Alternative?
Kopieren wir eine vorhandene etc.tar nach etc_sav1.tar, damit haben wir immer eine Sicherungskopie des Vortages, wenn etwas schief läuft.

Variante 2, EINE Sicherungskopie der Sicherung erstellen

Nach dem Test ist der BEFEHL cp ungeeignet aber mit mv -f funktioniert es:

[root@blue backup]# mv -f etc.tar etc_sav1.tar


Voraussetzung ist allerdings dass etc.tar vorhanden ist, sonst gibt es einen Fehler.



Wie kann ich prüfen ob etc.tar existiert?

if [ -f /home/backup/etc.tar ];then
    mv -f /home/backup/etc.tar /home/backup/etc_sav.tar
fi

Zugegeben diese Shell - Scripts sind wirklich oft kryptisch. Diese Variante zu überprüfen ob die Datei existiert habe ich einfach aus einem Script im Verzeichnis /etc/rc.d/init.d abgekupfert.
 

[ top ]

Vorläufige Festlegung des Ablaufes des Shell Scripts

  1. nachschauen ob verzeichnis existiert
  2. wenn nicht anlegen
  3. nachschauen ob etc.tar existiert. wenn ja ec_sav1.tar anlegen.
  4. tar archiv erstellen.
     

[ top ]

Das Shell - Script

Informationen zum Erstellen  sind kursiv und Blau.

Die Shell die das Script ausführen soll muss angegeben werden!
#!/bin/sh
#
Es sollte im Script vermerkt sein, wo dieses Script sinnvollerweise abgelegt wird.
# /etc/scripts/etc_backup/etc_backup.sh
#
Für Fragen sollte der Ersteller bekannt sein; Ein Erstellungsdatum und eventuell eine Version sind sehr sinnvoll
# wilhelm.moser@demos.at 2003-07-11 14:00
#
Wichtig ist auch für welches Betriebssystem das  Script entwickelt wurde. Wenn Sie Programme mit einbinden oder
für services Konfigurationen erstellen bitte immer die Programmversion mit angeben.
Z.B. uses: sendmail-3.2.1-5.i386.rpm usw.
# distribution RedHat 7.2
#
# script to backup the etc by tarring it to /home/backup/etc.tar
# for security reasons etc.tar, if exists, will be moved to
# /home/backup/etc_sav.tar

# make Directory and resume if directory exists
mkdir -p /home/backup
mkdir -p /home/backup_sav
 

# check if /home/backup/etc.tar exists. If yes move
# etc.tar to etc_sav.tar which will be replaced when file exists
if [ -f /home/backup/etc.tar ];then
    mv -f /home/backup/etc.tar /home/backup/etc_sav.tar
fi
 

# directory etc will be tarred to etc.tar
# tar -cf /home/backup/etc.tar /etc

Am Ende des Scripts sollten Sie in jedem Fall exit 0 angeben. Vergessen Sie bitt die LEERZEILE nach exit 0 nicht!!
exit 0

 

[ top ]

Die Weiterentwicklung als inkrementielle Sicherung mit Full-Backup

Sicherungen über das Netzwerk zu einem entfernten Rechner

Anlagen

GNU tar: an archiver tool FTP release, version 1.12, 24 April 1997 (noch immer aktuell)
Backup - Strategien (etwas ausführlicher)
Backup/Restore per Shell-Script vom Linux Stammtisch Bremerhaven
Datensicherung mit Amanda