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