Logo


Computer Communication & Consulting

Linux Shell Scripts

letzte Änderung 14.10.2007

Linux - Kurze Skripte ... kleine Helfer


Kopieren und Verschieben mit TAR
Einfaches Synchronisation von USB-Sticks mittels rsync
timeout - Framework zum Überwachen von Scripts
BlueFoto - Lesen von digtalen Fotos via BlueTooth
QI - QuickInfo: Ein Informationssystem für die Shell
sticksync: Skript zum Synchronisieren von USB-Datenträgern

Verschieben eines Verzeichnis-(Teil)Baums mittels tar

Am besten erklärt man das an einem Beispiel:
Nehmen wir an, der Plattenplatz auf der Root-Partition läuft über. Schuld daran ist, dass einige Applikationen in /opt installiert wurden. Unter /usr ist ausreichend Plattenplatz verfügbar und /opt soll dorthin verschoben werden.

Hier zeigt sich die Mächtigkeit der Shell von UNIX/Linux. Man muß dazu noch nicht mal ein Skript schreiben, sondern kann die Kommandos direkt auf der Shell eingeben. Loggen Sie sich dazu als root ein.

cd /
tar cSpf - opt | ( cd /usr; tar xvSpf - )
rm -rf /opt

Am einfachsten lässt sich das Kopieren mittels tar durchführen. Sie müssen nur sicherstellen, dass Sie vor dem Kopieren im richtigen Verzeichnis sind. Achten Sie unbedingt auf korrekte Schreibweise. Speziell beim rm Kommando können Tippfehler fatale Folgen haben. Anschließend wird mit

ln -s /usr/opt /opt

dem System das /opt Verzeichnis wieder an der richtigen Stelle bekannt gemacht.

Die Verwendung von tar anstelle von cp -R hat den Vorteil, dass die Datei-Metadaten wie Zugriffsrechte, Owner und Zugriffszeiten erhalten bleiben.

zum Seitenanfang


Synchronisation von USB-Sticks mittels rsync

USB-Sticks sind eine richtig gute Sache. Sie sind preiswert und bieten eine ganze Menge Platz z.B. für Datensicherungen oder zum Transport von Daten zwischen zwei Rechnern, beispielsweise zwischen Zuhause und Büro oder zwischen NoteBook und Desktop.

Leider ist das manuelle Kopieren von Dateien immer fehlerträchtig. Zu leicht hat man die "alte" Datei über die neuere kopiert, weil man sich in der Richtung vertan hat. Manchmal hat man auch nur vergessen, welche Datei zuletzt bearbeitet wurde.

rsync ist im Prinzip ein verbessertes Copy-Programm. Währen cp stur eine Datei nach der anderen kopiert, kann man rsync mittels Optionen dazu bringen, dass es nur geänderte Dateien kopiert und auch nur neuere Dateien über ältere schreibt. rsync hat zusätzlich den Verteil, dass es nur geänderte Dateien kopiert, was den in Schreibzyklen begrenzten Flash-Speicherzellen gut tut und die Kopierzeit deutlich verkürzt.

#!/bin/sh

# Script synchronisiert USB-Stick mit local DIR
# Bernd Holzhauer 2006/2007
#
# der Stick muss unter $STICK gemounted sein
# und er sollte eine Datei mit Namen STICK# enthalten

STICK=/media/disk

### falls automatischer mount gewünscht ###
if [ ! -d $STICK ]; then
    ### mount stick ###
    # dazu muss ein Eintrag in /etc/fstab sein wie z.B: 
    # /dev/sdb1 /media/usbstick auto noauto,user 0 0
    /bin/mount $STICK
fi

if [ ! -d $STICK ]; then
    echo "Stick nicht gemountet"
fi

if [ -f $STICK/STICK1 ]; then
    ### der Stick ist mit VFAT formatiert und mit Optionen gemounted
    # rw,nosuid,nodev,shortname=mixed,uid=1000,utf8,umask=077
    echo "$STICK/Stick1 gefunden"
    echo "Synchronisiere Zettelkasten mit Stick 1"
    # Desktop to Stick
    /usr/bin/rsync -rvt --modify-window=1 ~/daten/zettelkasten/*.zkl $STICK/zettelkasten/
    # Stick to Desktop
    /usr/bin/rsync -rvt --modify-window=1 $STICK/zettelkasten/*.zkl ~/daten/zettelkasten/
fi

if [ -f $STICK/STICK3 ]; then
    ### der Stick ist mit ext2 formatiert
    echo "$STICK/Stick3 gefunden"
    echo "Synchronisiere Projekte mit Stick 3"
    # Desktop to Stick
    /usr/bin/rsync -au ~/Projekte/ $STICK/Projekte/
    # Stick to Desktop
    /usr/bin/rsync -au $STICK/Projekte/ ~/Projekte/
    # Just Backup to Stick
    /usr/bin/rsync -au  --exclude *.bak ~/Dokumente/ $STICK/Dokumente/
fi

Mit der Variablen STICK wird der Pfad zum gemounteten Stick angegeben. Falls der Stick nicht gemountet ist, wird ein Mount Versuch gestartet. Damit man auf User Level mounten darf, muß ein entsprechender Eintrag in /etc/fstab vorhanden sein. Um die verschiedenen Sticks automatisch erkennen zu können, ist auf jedem Stick eine Datei STICKn angelegt. Dadurch kann man für jeden Stick eigene Kopieranweisungen haben.
Die Punkte "Desktop to Stick" und "Stick to Desktop" sind je Subdir-Ast durch Zeilen zu ergänzen und ggf. entsprechend der Wichtigkeit/Aktualität der Daten in der Reihenfolge zu tauschen.

STICK1 ist mit FAT16 oder FAT32 formatiert und damit auch unter Windows benutzbar. Unter Ubuntu werden USB-Sticks mit VFAT Formatierung automatisch mit den angegebenen Optionen gemounted.

STICK2 ist mit einem Linux ext2 (oder ext3) Dateisystem formatiert. Das hat für die verwendung von rsync entscheidende Vorteile. Die Option -a (archive) sorgt dafür, dass alle Dateien (inkl. Links und Subdirs) behandelt werden, die Datei Attribute bleiben dabei erhalten und -u (update) stellt sicher, dass neue Dateien nicht durch ältere Überschrieben werden. rsync ist einmal für jede Richtung aufzurufen. Damit ist eine Synchronisation durchgeführt.

Nicht möglich ist mit diesem Script ein Abgleich, wenn Dateien auf beiden Zielsystemen gleichzeitig verändert wurden.

Solange Sie das Script testen, sollten Sie unbedingt die Optionen -v (verbose) und -n (dryrun) mit verwenden um Datenverluste auszuschließen.
Für VFAT also /usr/bin/rsync -rvtvn --modify-window=1 ... und
für Linux /usr/bin/rsync -auvn
Dryrun (-n) zeigt nur die zu synchronisierenden Datein an, der eigentliche Kopiervorgang wird nicht durchgeführt.

sticksync verbessertes Skript zur Synchronisation von USB-Datenträgern.
zum Seitenanfang


timeout - Framework zum Überwachen von Scripts

Es gibt Funktionen in Skripten, die auf eine Eingabe oder den Ablauf eines externen Kommandos warten. Wird nun nichts eingeben oder hängt z.B. ein ssh-Remote Kommando, dann wird das Script nie beendet.

Manchen Funktionen wie z.B. READ kann man einen Timeout gleich voreinstellen. Bei ssh ist das je nach verwendeter Version auch möglich, aber leider nicht immer. Wünschenswert ist daher eine Möglichkeit, die unabhängig von verwendeten System ein Shellscript nach Ablauf einer voreingestellten Zeit abbricht. Der Einfachheit halber wird im Beispiel die READ Funktion zu Überwachung verwendet.

Hier ist ein Framework für die Zeitüberwachung eines Scripts:

 1 ### timeout: Test programm (framework) for timeout trapping
 2 echo "Time-Out Test"

 3 ### define trap and error Return procedure ###
 4 trap "echo 'Programm wird abgebrochen'; exit 1" INT

 5 TIMEOUT=10

 6 ### run subshell to watch and kill with TIMEOUT ### 
 7 ( sleep $TIMEOUT; echo "***TIMEOUT***"; kill -INT $$ 2>/dev/null ) &
 8 echo "timeout procID=$$ - subshell procID=$!"

 9 ### process to watch ###
10 echo -n "Zeile eingeben> "
11 read result

12 ### kill subshell if normal execution continues ###
13 # program will not reach here if subshell sleep times out
14 # $! refers to last process put into background - here the subshell
15 if [ -n "$result" ]; then echo "kill -HUP $!"; kill -HUP $!; fi

16 echo "eingabe=$result"
17 exit 0

Die Zeitüberwachung wird mittels Trap-Funktion und Subshell durchgeführt.

Die Trap-Funktion wird in Zeile 4 definiert. Sie gibt die Fehlermeldung "Programm wird abgebrochen" aus und bendet das Script mit Return-Code 1.
In Zeile 7 wird die Zeitüberwachung per Subshell aktiviert. Die Subshell "schläft" für die über TIMEOUT in Sekunden definierte Zeit und löst dann per kill -INT die Trap aus. Die Echo-Ausgabe "***TIMEOUT*** ist zu Testzwecken eingebaut und sollte im realen Script entfallen.
Wird bei dem Test-Script innerhalb von 10 Sekunden eine Zeile eingegeben, so wird per Zeile 15 die Subshell beendet. Der Sleep wird dadurch nicht "gekillt". Er läuft normal zu Ende. Seine aufrufende Subshell ist jedoch bereits beendet und der Kill aus Zeile 7 wird nicht mehr durchgeführt.

Wichtig ist es die Trap Definition mit einem Exit-Befehl abzuschließen, das sonst das Script nicht beendet würde.

Den Return Code des Scripts kann auf der Shell per echo $? abfragen.

zum Seitenanfang




Home Page
Ranking-Hits
Copyright © 2001-2014 Bernd Holzhauer. Alle Rechte vorbehalten.
Warenzeichen und Marken sind Eigentum der jeweiligen Besitzer.

Das Ing.Büro Bernd Holzhauer distanziert sich grundsätzlich von gesetzeswidrigen und möglicherweise illegalen Inhalten in Seiten, auf die über www.cc-c.de verwiesen wird. Sollte Ihnen diesbezüglich etwas auffallen, melden Sie es uns bitte per email.