Das Szenario sieht folgendermaßen aus: Maschine A verfügt über Dateien, die ich auf Maschine C kopieren möchte. Maschine A kann nicht direkt auf C zugreifen, kann jedoch auf Maschine B zugreifen, die auf Maschine C zugreifen kann dann von B nach C.
Auf Computer B ist der Speicherplatz begrenzt. Wenn Dateien eingehen, müssen sie nach C kopiert und von B gelöscht werden. Die zweite Kopie ist viel schneller, daher ist dies kein Problem mit der Bandbreite.
Ich könnte das von Hand machen, aber ich bin faul. Was ich möchte , ist ein Skript auf B oder C auszuführen , die jede Datei in C kopiert als je ein beendet . Der SCP-Job wird von A ausgeführt.
Also, was ich brauche, ist eine Möglichkeit zu fragen (vorzugsweise aus einem Bash-Skript), ob das Kopieren der Datei X.avi "fertig" ist. Jede dieser Dateien hat eine andere Größe, und ich kann die Größe oder den Zeitpunkt der Fertigstellung nicht wirklich vorhersagen.
Edit: Übrigens, die Dateiübertragungszeiten betragen ungefähr 1 Stunde von A nach B und ungefähr 10 Minuten von B nach C, wenn die Zeitskala überhaupt wichtig ist.
scp * user@host:~/
und die zu kopierenden Dateien mehr als Maschine B füllen würden, sodass ich Dateien nicht verschieben / umbenennen kann, nachdem sie von A kopiert wurden.Zeigt
lsof
Maschine B, dass scp die Datei geöffnet hat? In diesem Fall können Sielsof
sehen, wann scp die Datei schließt. Wenn nicht, können Sie die Größe der Datei beobachten und sie, nachdem sie sich über einen bestimmten Zeitraum (z. B. 5 Minuten) nicht geändert hat, von B nach C kopieren.Eine dritte Möglichkeit besteht darin, die Dateien von A in ein Verzeichnis "in_progress" auf C zu kopieren. Führen Sie nach Abschluss des Kopiervorgangs auf A einen
mv
Befehl aus, um das Verzeichnis "in_progress" zu verlassen.quelle
lsof
auf Computer B leider nicht zu existieren. Bei Ihrer dritten Option funktioniert das nicht, denn wenn ich die Kopie beenden lasse, bevor ich etwas tue, werde ich meinen zulässigen Speicherplatz auf B (etwa 10: 1) erheblich überfordern. Welche Lösung ich auch habe, muss während des Kopierens funktionieren.Ich dachte nur an eine andere, völlig unabhängige Option. Verwendet scp überhaupt nicht. Bitte lassen Sie mich wissen, ob dies funktionieren würde:
Erstellen Sie auf B eine Fifo-Pipe: mkfifo / tmp / xfer
auf A nicht scp verwenden, stattdessen
tar -cz files | ssh B 'cat > /tmp/xfer
auf C laufen
ssh B 'cat /tmp/xfer' | tar -xz
Auf diese Weise werden Daten nicht in B gespeichert, sondern nur durch die Pipe geleitet. Der Nachteil dabei ist, dass Sie immer nur eine Kopie gleichzeitig haben können ...
Sie müssen sicherstellen, dass der Prozess auf C bei jedem Abschluss neu gestartet wird.
quelle
Nachdem ich über die Antworten nachgedacht hatte (insbesondere über die Idee von @Josh, sich die geänderten Zeiten anzusehen), versuchte ich, die Dateien von B auf C zu manipulieren war dort. Ich bin auf diese Lösung gestoßen. Diese Idee ist nicht meine, ich habe sie in der Google-Suche vor dieser Frage gefunden. Ich habe es früher verworfen, da Maschine B nicht über das
find
Dienstprogramm verfügte.Hängen Sie zuerst das entsprechende Verzeichnis in B in C ein, damit es als lokales Dateisystem angezeigt wird. Ich habe es benutzt
sshfs
(übrigens ein großartiges Werkzeug). Dadurch kann ich die Dienstprogramme von C anstelle von B verwenden.Zweitens stimmt der Befehl
find /the/folder/* -mmin +5
mit allen Dateien überein , die vor mehr als 5 Minuten geändert wurden. Der Befehlfind /the/folder/* -mmin +5 -exec {} /the/other/folder \;
verschiebt also alle Dateien, die vor mehr als 5 Minuten geändert wurden, in den anderen Ordner (der sich tatsächlich in C befindet, anstelle von sshfs, das von B bereitgestellt wurde).Schließlich habe ich ein Cron-Skript eingerichtet, um das obige Skript heute und morgen alle 10 Minuten auszuführen. Die Linie in meiner Crontab sieht so aus.
Hoffentlich klappt das. Die nächste Datei muss noch fertiggestellt werden, daher kann ich nicht beurteilen, ob sie in Kombination mit dem Cron-Skript wirklich funktioniert, aber ich habe einige Dateien von Hand erstellt, sie geimpft und sie verschoben. drücke die Daumen
Bearbeiten: Dies funktioniert, obwohl es ursprünglich einige Fehler hatte, die jetzt korrigiert werden.
quelle
Mkfifo ist nicht nötig. Führen Sie auf Maschine B Folgendes aus:
Möglicherweise ist die Option -C von tar hilfreich.
Wenn Sie den Kopiervorgang auf Maschine A starten müssen, gehen Sie wie folgt vor:
Achten Sie jedoch auf korrekte Zitate.
quelle
Die Kopie wird entweder als ein anderer Prozess ausgeführt, oder Sie können sie mithilfe einer Subshell erzwingen. Dann könnten Sie ps verwenden, um den Prozess zu "beobachten" und zu sehen, wann er verschwindet.
Außerdem glaube ich, dass Sie in * nix die Datei löschen können, während sie kopiert wird. Das System löscht es erst, wenn das Kopierprogramm es schließt. Wenn die Kopie nicht erfolgreich ist, verlieren Sie natürlich die Datei. Dies ist also nicht die beste Idee.
quelle