• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

FIXED:Mittels scp "atomar" kopieren

styyxx

Member
Hi,

ist es möglich mittels scp eine Kopie atomar durchzuführen?
Ich will also von der lokalen Maschine eine Datei auf die entfernte Maschine in ein spoolverzeichnis kopieren. In diesem spoolverzeichnis soll die Datei aber nur auftauchen wenn sie komplett kopiert wurde. Ich hab in der man page und in google nichts gefunden. Auch im O'Reilly ssh Wälzer nicht. Doch vielleicht hab ich auch nur nach dem falschen gesucht ;-)

Wenn da jemand bescheid weiß wär das klasse.

Grüße
styyxx
 

gameboy

Hacker
Hallo styyxx,

leider weiß ich nichts über den Kontext Deines Problems und den Umständen, unter denen das Kopieren stattfindet... - Aber vielleicht kannst Du folgenden Ansatz verwenden:

1.) Datei in ein anderes (Temp-)Verzeichnis kopieren mit scp
2.) Datei Umbenennen/Verschieben auf dem Zielsystem (mit mv)

Der zweite Schritt ist dann im Prinzip atomar...
 
OP
S

styyxx

Member
Erstmal Danke für den Tip.

Auf die Idee mit einem zweiten Verzeichnis bin ich auch gekommen. Leider kann es da auch passieren, das die Datei z.B. nur halb übertragen wurde und der mv dann halt die halbe verschiebt.

Es muß also gewährleistet sein, das im spoolverzeichnis die Datei ankommt die auch abgeschickt wurde. Komplett. Ich hab auch schon an eine MD5 Summe gedacht. Doch das ist halt nicht so schön "smooth" wie direkt mit einem Befehl.

Der Kontext ist ganz einfach das das bisher mit uucp gemacht wird und ich will das ändern, da der uucp teilweise mehr Probleme macht als nötig.

Grüße
styyxx
 

oc2pus

Ultimate Guru
gameboy schrieb:
1.) Datei in ein anderes (Temp-)Verzeichnis kopieren mit scp
2.) Datei Umbenennen/Verschieben auf dem Zielsystem (mit mv)

Der zweite Schritt ist dann im Prinzip atomar...
der zweite Schritt ist nicht atomar, weil die Zieldatei schon zu "sehen" ist bevor sie vollständig verschoben wurde ....
 

gameboy

Hacker
oc2pus schrieb:
der zweite Schritt ist nicht atomar, weil die Zieldatei schon zu "sehen" ist bevor sie vollständig verschoben wurde ....
Meinst Du damit, daß es sein kann, daß die Zieldatei bereits zu "sehen" ist, der Inhalt aber trotzdem z.B. erst zur Hälfte vorhanden ist?

Ich bin (leichtsinnigerweise) implizit davon ausgegangen, daß das temporäre Verzeichnis auf der gleichen Partition liegt und daß daher die Datei nicht kopiert werden muß, sondern lediglich der Verzeichnis-Eintrag geändert wird. Daher meine Annahme, daß diese Operation zumindest im Sinn der Problemstellung von styyxx als "atomar" angesehen werden kann.

Besser als das Parken der Datei in einem Zwischenverzeichnis wäre sicherlich noch die Verwendung des tatsächliche Zielverzeichnisses, wobei beim Kopieren mit scp zunächst ein Zieldateiname verwenden wird, der verhindert, daß die Datei bereits verarbeitet wird. Nach Abschluß des Kopiervorgangs könnte dann die Umbenennung der Datei mit dem mv-Kommando erfolgen, wobei die Datei dann aber im selben Verzeichnis verbleibt.

Oder kann es dabei immer noch Probleme geben? (Unter Windows habe ich ein ähnliches Verfahren schon des öfteren als asynchronen Kommunikations-Mechanismus für Prozesse auf unterschiedlichen Maschinen eingesetzt.)
 

oc2pus

Ultimate Guru
gameboy schrieb:
Ich bin (leichtsinnigerweise) implizit davon ausgegangen, daß das temporäre Verzeichnis auf der gleichen Partition liegt und daß daher die Datei nicht kopiert werden muß, sondern lediglich der Verzeichnis-Eintrag geändert wird.
Mit dieser Einschränkung könnte es gehen, dann ist es kein "move" sondern ein "rename".
 

gameboy

Hacker
oc2pus schrieb:
Mit dieser Einschränkung könnte es gehen, dann ist es kein "move" sondern ein "rename".
Genau das ist es, worauf ich hinaus wollte. Ein Rename kann man im Prinzip als atomar betrachten, denn dabei wird ja nicht der Inhalt der Datei dupliziert.
 
OP
S

styyxx

Member
Hallo,

danke für die Hilfe.

Die Sache mit dem rename hab ich so noch gar nicht bedacht. Das ist eine sehr gute Idee. Die Datei kann ich auf das selbe volume kopieren in dem sie dann auch umbenannt wird. Einfach eine zweite ssh Session hinterher schicken wenn der scp erfolgreich war.
Alternativ hab ich mir gedacht die Berechtigung der Datei zuerst auf "niemand darf lesen" zu setzen und nach erfolgreicher Kopie sie mittels einer zweiten session zu ändern.
Was haltet ihr für die bessere Möglichkeit?

Grüße
styyxx
 

gameboy

Hacker
Deinen Ansatz, das ganze über die Berechtigungen der betreffenden Datei zu regeln, finde ich ganz interessant. Im allgemeinen würde ich aber wohl die andere Variante (Kopieren/Umbenennen) bevorzugen. Letztlich wird man seine Entscheidung sicherlich davon abhängig machen, wie der Prozeß, der die Datei konsumiert, die Existenz einer zu verarbeitenden Datei überprüft.

Beispiel: Ein Shell-Script (test.sh) prüft mit
Code:
if [ -f test.txt ] ; then
  echo "Datei existiert"
fi
ob die Datei test.txt existiert. Dabei sollte man sich bewußt sein, daß diese Überprüfung auch dann erfolgreich sein wird, wenn niemand irgendwelche Rechte an der Datei hat:
Code:
> ls -l test.txt
----------  1 td users 0 2005-12-07 22:32 test.txt

> ./test.sh
Datei existiert
Die Existenz der Datei ist also trotz fehlender Leseberechtigung "sichtbar". Ob dieses Beispiel auf Deinen konkreten Anwendungsfall übertragbar ist, weiß ich natürlich nicht. Sicherlich sind auch andere Methoden denkbar, die Existenz einer zu verarbeitenden Datei zu prüfen. Der konsumierende Prozeß könnte z.B. einfach versuchen, die betreffende Datei zum Lesen zu öffnen und aus einem evtl. auftretenden Fehler schließen, daß sie nicht existiert. In diesem Fall würde der Ansatz, die Leseberechtigung erst nach Abschluß des Kopiervorgangs zu setzen, zu dem gewünschten Ergebnis führen.
 
OP
S

styyxx

Member
Guten Morgen,

also nachdem ich eine Nacht drüber geschlafen habe, muß ich sagen das ich wohl die Berechtigung vorziehen werde. Der Dateiname ist zwar immmer nach einem bestimmten Muster aufgebaut, entweder eine mehrstellige Zahl oder zwei Buchstaben und dann sechs Ziffern. Ich denke jedoch das ich das pollen durch die Berechtigungen vereinfachen kann, da ich mir dann einfach eine Liste aller Dateien in dem Verzeichnis hernehme und die mittels [ -r dateiname ] teste.

Nur zur Erklärung. Das ganze ist für ein EDI System gedacht. Das läuft alles automatisch. Die Dateien werden empfangen. Vom EDI System bearbeitet, abgelegt, auf die einzelnen Maschinen der entsprechenden Werke übertragen und dort von einem Prozess weiterverarbeitet und in das ERP System gestellt. Dieses Übertragen auf die Maschinen läuft eben mittels uucp und das ist nicht mehr so ganz zeitgemäß, besonders weil der uucp von HP-UX nicht so dolle ist und wir eh immer den Taylor installieren müßen. Außerdem gibt es bei uns gerademal eine(!) Person die sich mit dem Dinosaurier uucp richtig auskennt. Da daß alles Produktivdaten sind und davon abhängt ob das Werk nun produzieren kann oder nicht, müßen die Dateien natürlich komplett übertragen werden, weil sonst krachts irgendwo hinten.

Auf jedenfall Danke für eure/deine Hilfe

Grüße
styyxx
 

taki

Advanced Hacker
BTW

Die meisten IO-Slaves von KDE arbeiten auch mit Umbenennen. Erst wird die Datei mit der zusätzlichen Dateiendung .part kopiert. Wenn beim Kopieren etwas schief geht, wird beim nächsten Versuch per Resume der Rest geholt. Erst wenn die Datei vollständig am Zielort angekommen ist, wird sie umbenannt (Endung .part entfernt).

Dieses Verhalten kenne ich von den IO-Slvaves "fish://", "(s)ftp://" und "audiocd:/mp3" ( :wink: !). Mit Sicherheit verhalten sich aber noch weitere IO-Slaves genauso.

Evtl. lohnt es sich für Dich, Dir mal die Source eines IO-Slaves anzuschauen (z.B. hier http://websvn.kde.org/branches/KDE/3.5/kdebase/kioslave/sftp). Besonders interessant finde ich die Sachen um "if (markPartial)" herum...). Aber das ist natürlich nicht mehr Konsole und schon ein wenig aufwendiger.
 
OP
S

styyxx

Member
Tach nochmal,

tja das mit dem umbennen scheint ja beliebt zu sein ;-)

Leider kann ich kein c++. Habs mir aber trotzdem angeguckt. Ein bisserl c versteh ich ja...
Ist auf jedenfall interessant zu sehen wie die Programme so funktionieren.

Grüße
styyxx
 
Oben