ubuntuusers.de

Synchronisieren mit "Rsync" - WebDav-Server

Status: Ungelöst | Ubuntu-Version: Ubuntu 8.04 (Hardy Heron)
Antworten |

bigtruite

Anmeldungsdatum:
7. April 2009

Beiträge: Zähle...

Hallo, ich habe mir neulich ein kleines Skript gebastelt, mit dem ich jetzt mittels Rsync http://wiki.ubuntuusers.de/rsync auch mein GMX-Mediacenter (WebDav) mit einem Verzeichnis lokal synchronisiere.

Hier das Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash

# 3 Minuten warten
# sleep 180s

# Verzeichnis anlegen
mkdir /media/syncro_gmx-mediacenter

# WEB-DAV in /media/syncro_gmx-mediacenter mounten
mount.davfs https://mediacenter.gmx.net /media/syncro_gmx-mediacenter

# Syncronisation von /media/syncro_gmx-mediacenter mit /home/pascal/Eigene_Dateien/Pascal/Band/WebDAV
rsync -av --progress --delete -i --log-file=/home/pascal/Eigene_Dateien/Pascal/Band/Retrocks/rsync.log /media/syncro_gmx-mediacenter /home/pascal/Eigene_Dateien/Pascal/Band/WebDAV

# Unmounten
umount.davfs /media/syncro_gmx-mediacenter

# Verzeichnis löschen
rmdir /media/syncro_gmx-mediacenter

# Meldung nach Synchronisation
# umount.davfs:
#  finde keinen mount.davfs-Prozess mit PID 8339;
#  versuche trotzdem das Dateisystem auszuhängen;
#   /var/run/mount.davfs/media-syncro_gmx-mediacenter.pid muss wahrscheinlich von Hand gelöscht werden

# Prozess vorsichtshalber löschen
rm /var/run/mount.davfs/media-syncro_gmx-mediacenter.pid

# Checkbox anzeigen, dass Syncro fertig ist
zenity --info --text "Die Synchronisation mit dem GMX-Mediacenter wurde gerade beendet!"

# Bash schließen
exit

Ich habe mir gedacht, dieses Skript als Cron-Job beim Reboot (als Root) auszuführen. Deswegen habe ich die 180 sekunden Sleep hinzugehängt, damit sich das WLAN beim Benutzeranmeldung aktivieren kann.

Folgendes Problem:

Erfolgt die Anmeldung im System nicht innerhalb dieser 180 Sekunden, dann schlägt der Mount-Web-DAV-Prozess fehl, das Verzeichnis /media/syncro_gmx-mediacenter ist somit leer und die Synchronisation erfolgt mit einem leeren Ordner. Das heißt mein Zielverzeichnis [/home/pascal/Eigene_Dateien/Pascal/Band/WebDAV] wird gelöscht....

Frage:

1.) Kann man da ne Anfrage einbauen, dass er die Synchronisation nur durchführt, wenn der Mount-Prozess erfolgreich war bzw. das Verzeichnis /media/syncro_gmx-mediacenter nicht leer ist?

2.) Was müsste im Skript ergänzt werden?

3.) Wenn das Verzeichnis /media/syncro_gmx-mediacenter leer ist, dann sollte der Synchronisationsprozess abgebrochen werden.

Vielleicht kann mir einer von Euch kurz unter die Arme greifen....

Vielen Dank im voraus. ☺

Grüße Pascal

amazin

Anmeldungsdatum:
21. Dezember 2008

Beiträge: 130

Hi!

Ich habe mir erlaubt das Skript komplett zu überarbeiten. Zu diesem Fehler beim Unmounten habe ich einen Bugreport gefunden. Im Script versuche ich diesen Bug durch setzen und anschließendes zurücksetzen der Umgebungsvariable I_WANT_A_BROKEN_PS (siehe Funktion) zu umgehen.

Falls du dich fragst, wofür diese Variable gut ist, aus dem Manual zu ps:

Setzen Sie die Umgebungsvariable I_WANT_A_BROKEN_PS, wenn Sie die BSD-Syntax auch dann erzwingen möchten, wenn Optionen ein Bindestrich vorangestellt ist.

Merke: Nach englischen Fehlermeldungen lässt sich besser googlen! ☺

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash

# 2 Minuten warten
sleep 2m

# Variablen setzen
GMX="/media/syncro_gmx-mediacenter"
MYDIR="/home/pascal/Eigene_Dateien/Pascal/Band/WebDAV"
CENTER="https://mediacenter.gmx.net"
LOGFILE="/home/pascal/Eigene_Dateien/Pascal/Band/Retrocks/rsync.log"

#Testen, ob Script als Root ausgeführt wird
if [ $(id -u) -ne 0 ]; then
    echo "Script muss mit Root-Rechten ausgeführt werden."
    exit 1
fi

# Wenn nicht existent, Mountpoint "GMX" (siehe Variablen oben) erstellen
if [ ! -d $GMX ]; then
    mkdir $GMX
fi

# Funktion zum Mounten und Syncen: Wenn Mounten erfolgreich, Syncronisation starten, Unmounten; 
# sonst 10 Sek. warten und erneuter Versuch
trysync () {
mount -t davfs $CENTER $GMX
if [ $? -eq 0 ]; then
    rsync -av --progress --delete -i --log-file=$LOGFILE $GMX $MYDIR
    export I_WANT_A_BROKEN_PS=1
    umount $GMX && rmdir $GMX
    export I_WANT_A_BROKEN_PS=0
    if ! mount | grep "$GMX" && [ -f /var/run/mount.davfs/media-syncro_gmx-mediacenter.pid ]; then
       rm /var/run/mount.davfs/media-syncro_gmx-mediacenter.pid
    fi
    exit 0
else
    sleep 10
    trysync
fi
}

# Funktion aufrufen
trysync

bigtruite

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 20

Hallo Amazin,

vielen Dank fürs überarbeiten. Echt eine super Sache... muß noch einiges lernen...liegt auch wahrscheinlich daran, dass ich halt mal kein Programmierer bin ... 😉

Folgende Fragen hätte ich zum Skript:

1.) In Zeile 27 steht "if [ $? -eq 0 ]; then" .... bin mir über die Funktion noch unsicher. Ist das nicht ein Fehler. Würde das nicht bedeuten wenn das Verzeichnis gleich 0 ist, dass es dann mit Zeile 28 weitergeht... das Verzeichnis muss ja voll sein (da gemountet)... erst dann kanns weitergehen.... wahrscheinlich täusch ich mich ja auch wegen der Zeile ☹

2.) Wozu dient Zeile 43?

Viele Grüße

Pascal

Jules

Anmeldungsdatum:
10. Dezember 2006

Beiträge: 57

1) $? ist eine sehr nützliche _Variable_ ! Hier wird immer der Returncode des letzten ausgeführten Befehls gespeichert. Standardmäßig liefern Befehele Returncode = 0, wenn sie erfolgreich (also fehlerlos) terminiert sind. Mehr Infos zum jeweiligen Returncode gibt's in der jeweiligen manpage zum benutzten Befehl.

2) Amazin hat dein gesamtes Skript in eine sog. Funktion ausgelagert. Über Sinn und Unsinn bei diesem Skript kann man darüber streiten, es ginge selbstverständlich auch ohne Funktionsdefinition. In diesem Fall würde dieser ( Zeile 43 😉 ) nämlich wegfallen.

Grüße Jules

amazin

Anmeldungsdatum:
21. Dezember 2008

Beiträge: 130

Um noch etwas tiefer auf die Fragen einzugehen, "$?" liefert hier den Rückgabewert von "mount", dem zuvor ausgeführten Befehl, zurück. Sollte dieser 0 sein, was bedeutet, dass das Mounten erfolgreich war, wird mit der Synchronisation begonnen. Andernfalls wird 10 Sekunden geschlafen und die Funktion erneut aufgerufen. Eine Funktion kannst du dir vorstellen wie ein kleines Programm im Programm. Zeile 43 ruft nun einmal dieses kleine Programm auf und anschließend startet es sich ggf. selbst wieder von vorn (Zeile 38).

Ich nutze gerne die Referenz von SelfLinux. Dort wird auf die Rückgabewerte und Funktionen nochmal genauer eingegangen.

So einfach wegfallen darf die Funktion nicht, sonst haben wir den Effekt nicht, dass bei fehlgeschlagenem Mountversuch nach 10 Sekunden erneut versucht wird zu mounten. Die Kritik ist aber berechtigt, evtl. wäre eine Until-Schleife stattdessen vernünftiger. Nun auch wieder mit Zenity-Meldung, die ich gestern vergessen hatte. ☺

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash

# 2 Minuten warten
sleep 2m

# Variablen setzen
GMX="/media/syncro_gmx-mediacenter"
MYDIR="/home/pascal/Eigene_Dateien/Pascal/Band/WebDAV"
CENTER="https://mediacenter.gmx.net"
LOGFILE="/home/pascal/Eigene_Dateien/Pascal/Band/Retrocks/rsync.log"

#Testen, ob Script als Root ausgeführt wird
if [ $(id -u) -ne 0 ]; then
    echo "Script muss mit Root-Rechten ausgeführt werden."
    exit 1
fi

# Wenn nicht existent, Mountpoint "GMX" (siehe Variablen oben) erstellen
if [ ! -d $GMX ]; then
    mkdir $GMX
fi

# Solange GMX nicht gemountet, versuche alle 10 Sekunden zu mounten
until mount | grep "$GMX" &> /dev/null; do
   mount -t davfs $CENTER $GMX &> /dev/null
   sleep 10
done

#Synchronisation und Erfolgsmeldung mit Zeit & Datum in Logfile
rsync -av --progress --delete -i --log-file=$LOGFILE $GMX $MYDIR && \
echo "$(date +%d\ %b\ %X) Synchronisation "$GMX" mit "$MYDIR" erfolgreich abgeschlossen." > $LOGFILE

#Unmounten
export I_WANT_A_BROKEN_PS=1
umount $GMX && rmdir $GMX
export I_WANT_A_BROKEN_PS=0

if ! mount | grep "$GMX" &> /dev/null && [ -f /var/run/mount.davfs/media-syncro_gmx-mediacenter.pid ]; then
   rm /var/run/mount.davfs/media-syncro_gmx-mediacenter.pid
fi

# Checkbox anzeigen, dass Sync fertig ist
zenity --info --text "Die Synchronisation mit dem GMX-Mediacenter wurde gerade beendet!"

exit 0

bigtruite

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 20

Leute Danke. Ich habe das Skript jetzt mal laufen lassen. Klappt aber leider noch nicht ganz ...

- Das Verzeichnis /media/syncro_gmx-mediacenter wird angelegt, dann passiert gar nichts mehr...

- der WebDav-Server wird nicht gemountet...

- es kommt zu keiner Synchronisation...

Könnte es vielleicht an Zeile 24/25 liegen??? Was bedeuten diese beiden Zeilen genau??

Viele Grüße

amazin

Anmeldungsdatum:
21. Dezember 2008

Beiträge: 130

Mit der Until-Schleife werden die Befehle nach "do" solange ausgeführt, bis die Bedingung (mount | grep "$GMX") erfüllt ist. Mit "mount" (ohne Parameter) wird eine Liste der momentan eingehängten Laufwerke ausgegeben. Die Pipe "|" leitet die Liste an grep weiter und grep filtert nach dem Inhalt der Varibalen $GMX (/media/syncro_gmx-mediacenter). Ist die Ausgabe nicht leer, was bedeutet, dass dein WebDAV eingehängt ist, gibt grep den Returncode 0 (erfolgreich) zurück. Dadurch wird die Until-Schleife beendet und anschließend werden die folgenden Befehle (Synchronisation usw.) ausgeführt.

Das Anhängen von "&> /dev/null" schickt die Ausgaben ins Nirvana. Wenn du das überall weg lässt, sind die einzelnen Programme wieder "gesprächiger" und die Fehlerdiagnose fällt leichter. Außerdem könntest du die Until-Schleife manuell in der Konsole ausprobieren. Trenne dazu deine WLAN-Verbindung, führe den Befehl aus und verbinde wieder.

1
until mount | grep "/media/syncro_gmx-mediacenter"; do mount -t davfs https://mediacenter.gmx.net /media/syncro_gmx-mediacenter; sleep 10 ; done

Kennt mount vielleicht doch kein "davfs" bei der Option -t? Wenn der Befehl so nicht funktioniert, d.h. dein WebDAV anschließend nicht eingehängt ist, ersetze "mount -t davfs" durch "mount.davfs" und probier's nochmal. Ich hab kein WebDAV zum testen, aber bei mir funktioniert die Schleife so mit jedem anderen Laufwerk.

Antworten |