Seite 1 von 1
Aufruf von rsync aus python Scipt macht Probleme
Verfasst: Montag 31. August 2009, 09:44
von xenia
Hallo Zusammen!
Ich hab folgendes Problem mit dem ich einfach nicht weiter komme:
Ich möchte per rsync (der von pyinotify ausgelöst wird) ein Verzeichniss von einem Server über ein VPN auf einen anderen Server synchronisieren. Lokal (also ohne VPN) klappt das auch wirklich gut! Wenn ich über das VPN gehe habe ich folgende Probleme:
1. Versuch: os.system(rsync...)
läuft lokal.
Bei VPN Verbindung wird der Befehl ausgeführt, allerdings werden keine Daten übertragen. Lasse ich den String der den Befehl enthält per print direkt vor os.system am Bildschirm anzeigen, kopiere diesen und führe ihn in der shell aus, läuft er ausgezeichnet.
Also habe ich mir gedacht, daß es vielleicht daran liegt, das der Verbindungsaufbau per VPN zu lange dauert. Daher hab ich den Versuch unternommen, das Script erst dann weiter auszuführen wenn der rsync beendet ist:
2. Versuch: if pid==0: os.execl(pfad,rsync,...)
rsync wird ausgeführt und bringt eine Fehlermeldung:
rsync: change_dir "mein SRC Verzeichniss" failed: No such file or directory (2)
Ich kann auf der Konsole direkt in das in der Fehlermeldung angezeigte Verzeichniss wechseln. Ich starte das Script unter root, also sollte es doch alle Rechte haben - oder?!?
Hat vielleicht jemand von Euch ´ne Idee??? Weiß sonst nicht mehr was ich noch tun soll!
Vielen Dank im Voraus...
xenia
Verfasst: Montag 31. August 2009, 10:12
von Leonidas
Hallo xenia, willkommen im Forum,
Hast du schon versucht das subprocess-Modul zu nutzen?
Verfasst: Montag 31. August 2009, 15:53
von xenia
Hallo Leonidas,
danke für den Tip. Da ich mit python noch nicht so ganz auf du bin, hab ich mal nach diesem Schema abgeschrieben:
from subprocess import call
import sys
try:
retcode = call("mycmd" + " myarg", shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Aber leider ohne Erfolg:
[Errno 2] No such file or directory
Vielleicht noch ´ne Idee?!?
Verfasst: Montag 31. August 2009, 17:17
von xenia
So jetzt bin ich mal ´nen Schritt weiter, wenn ich:
retcode = call("rsync" + " parameter", shell=True) ausführe läuft es!!!
Das problem ist, die Parameter ändern sich, so dass ich sie aus einer Datei lese. Führe ich aber folgende Zeile aus:
retcode = call("rsync" + str(fobj.readline()),shell=True)
bekomme ich nur die rsync hilfe in der shell angezeigt. Ich vermute mein str(fobj.readline()) schreibt nicht die Parameter, und es wird nur rsync ohne alles ausgeführt. Wenn ich mir mit:
print "rsync"+str(fobj.readline())
den Befehl anzeigen lasse, sieht er ok aus?!?
Verfasst: Montag 31. August 2009, 17:21
von Leonidas
Du solltest besser ``subprocess.Popen`` verwenden und die Parameter als Liste übergeben.
Verfasst: Dienstag 1. September 2009, 07:19
von xenia
Guten Morgen Leonidas,
hab mich die letzte Stunde mit subprocess.popen und der Liste rumgeschlagen!
Da ich rsync mit Zertifikat zwischen 2 PC´s ausführe ist die Syntax folgende:
rsync -e "ssh -i pfad zum Zertifikat" ...
Das Ergebnis mit subprocess.Popen ist folgendes:
rsync Failed to exec ssh -i ...: No such File or Directory(2)
File und Directory stimmen aber?!?
Ich krieg bald ´n Horn. Dank für Deine Geduld!
Xenia
Verfasst: Dienstag 1. September 2009, 09:23
von nemomuk
Verfasst: Dienstag 1. September 2009, 10:19
von xenia
So hatte ich´s gemacht, nur das ich die Parameter vorab in eine Liste geschreiben habe!
Hab jetzt aber anscheinend ´ne Lösung gefunden:
Ich schreibe den Rsync in ein Shell Script mach es mit os.chmod ausführbar und starte es mit subprocess.call.
Ist das sauber, oder haltet Ihr das für nicht so schick?!?
Verfasst: Dienstag 1. September 2009, 10:49
von nemomuk
ich kenne mich mit rsync nicht wirklich aus, aber bist du sicher, dass das so funktioniert?
Verfasst: Dienstag 1. September 2009, 11:19
von Leonidas
SchneiderWeisse hat geschrieben:
Also die inneren Quotes sind nicht nötig. Die besagen beim Shell-Aufruf ja nur "das ist jetzt ein Parameter". Das gleiche besagt ja auch schon die Liste, da musst du nicht extra noch quoten, weil sonst das Quote in den Parameter aufgenommen wird und auf dem Zielrechner ziemlich sicher kein Programm namens ``"ssh -i ..."`` vorhanden ist.
xenia: die Lösung über temporäre Dateien ist fürchterlich.
Verfasst: Dienstag 1. September 2009, 11:20
von Rebecca
Ich kenne mich mit rsync auch nicht aus, aber deine Fehlermeldung laesst vermuten, dass es nicht richtig ist "ssh -i" als
einen Parameter zu uebergeben. Wenn du den Befehl aus der Bash aufrufst, schreibst du dann
rsync -e ssh -i ... oder
rsync -e "ssh -i"? Je nach dem koennte es vlt. so klappen:
Die Doppelten Anfuehrungszeichen in SchneiderWeisses Version waren uebrigens ueberfluessig, du koenntest also auch nochmal das probieren:
Verfasst: Dienstag 1. September 2009, 11:33
von nemomuk
jop, das habe ich wohl zu schnell reingepastet und kopiert - die inneren Quotes sind natürlich falsch.
Verfasst: Dienstag 1. September 2009, 16:07
von xenia
Dank für die rege Teilnahme:
@Leonidas -die Lösung über temporäre Dateien ist fürchterlich.:
Ich muß sowieso mit temp. Dateien arbeiten. Rsync darf nur auf einer Seite gestartet werden. So das ich, wenn sich auf der anderen Seite etwas am Dateisystem ändert eh eine Temporäre Datei per scp auf den ausführenden Server sende. Diese enthält die Änderungen damit der dort laufende rsync den sync ausführt. Der Einfachheit halber erstelle ich für beide Seiten solche temp. Dateien packe Sie in eine "Queue" die von einem python script durchsucht und abgearbeitet wird.
Das klingt vielleicht ziemlich abenteuerlich, ist aber IMHO die simpelste Lösung.
@alle: Das mit den Anführungszeichen werde ich nochmal ausprobieren.
der Befehl lautet:
rsync -e "ssh -i /pfad/zum/Zertifikat" PARAMETER SRC DST
Danke schonmal an Alle!!!