Nur neue Dateien kopieren und kein Sync von 2 Ordnern

Status
Für weitere Antworten geschlossen.

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Hallo zusammen,
ich habe momentan folgendes Problem bei einem Netzlaufwerkprojekt.
Hierbei geht es darum, dass ein Downloadterminal bestimmte Dateien in einem Netzwerkpfad abspeichert. Diese Dateien werden anschließend von einem Programm an verschiedenen PCs ausgewertet. Hierbei ist der Netzwerkpfad auch als Datenverzeichnis im Program selbst hinterlegt.
Nun nutzt ein PC eine andere Software zur Auswertung der Daten und hier kann lediglich ein Importordner angegeben werden, aus dem die Daten dann lokal in eine eigene Ordnerstruktur übernommen werden. Das Problem hierbei ist, dass die Daten aus dem "Importordner" immer verschoben werden und somit die anderen Nutzer keinen Zugriff mehr auf die Dateien haben.

Gibt es eine Möglichkeit dass wenn das Downloadterminal eine Datei in den Netzwerkpfad schreibt, diese automatisch noch an einen weiteren Ordner durchgereicht wird?
Ein einfacher Sync zwischen Ordnern ist hier leider nicht zielführend, da das 2. Programm sonst bei jedem Start ca. 15min braucht um alle Dateien wieder komplett zu prüfen.

Vielen Dank im Voraus.
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Sehr ominöse Beschreibung. War ist ein Downloadterminal, welche Software ist sonst noch beteiligt?

Du kannst probieren auf dem Client mit 'subst' oder ähnlich einen Netzwerkordner in einem lokalen Pfad zur Verfügung zu stellen, ob das Programm das akzeptiert.
Nach zweitem lesen bringt das nichts, weil ja nicht das Problem, sondern das verschieben beim Import in Software 2.
 

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Sorry für die dürftige Beschreibung, ich wollte es nicht zu ausführlich machen.
Generell wird das ganze in einem Transportunternehmen eingesetzt. Die Fahrerkarten mit Lenkzeiten etc. werden regelmäßig im Downloadterminal ausgelesen. Dieses speichert die Dateien im Netzwerkordner ab (natürlich wäre es bei diesem Schritt die beste Lösung wenn die Dateien einfach an 2 verschiedene Ordner gleichzeitig kopiert werden, ist aber in den Einstellungen vom Downloadterminal nicht möglich).
Die Dateien werden dann einmal von verschiedenen Mitarbeitern mit einem Programm ausgewertet, dieses Programm nutzt eben die Daten direkt aus dem Netzwerkordner.
Dann gibt es eben noch ein Programm welches die Daten aus dem Netzwerkordner importiert, analysiert und dabei in eine eigene Ordnerstruktur abspeichert. Dabei werden die Daten aus dem Netzwerkordner gelöscht -> was natürlich Probleme wegen den Mitarbeitern mit dem anderen Programm mit sich bringt.
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Wenn das Programm 2 nicht dazu gebracht werden kann die Daten nicht zu löschen... dann ist es schwierig.
Du willst ja in dem Import Ordner nur Sachen haben die sich seit dem letzten Import im Ordner des Download Terminals neu hinzugekommen sind.

Wäre vielleicht eine Möglichkeit ein rsync Job im Aufgabenplaner anzulegen. Dafür den Ordner des Downloadterminal als Import Ordner für Programm zwei setzen, aber über den rsync Job regelmäßig dessen Inhalt in einen Archivordner abgleichen (keine alten löschen, nur neue hinzufügen) und das Programm 1 welches keine Daten löscht auf diesem Archivordner arbeiten zu lassen.

Dann muss man nur sicherstellen, dass mindestens ein Sync Lauf stattfindet bevor Programm 2 per Import die Daten aus dem Ordner abzieht.

Eventuell gibt es noch elegantere (und weniger fehleranfällige) Lösungen, muss man aber nochmal drüber nachdenken.
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.525
Punkte für Reaktionen
1.360
Punkte
234
Warum nicht umgekehrt?

Downloadterminal speichert in Ordner 1.
Ordner 1 kopiert (z.B. rsync) neue Daten in Ordner 2.

Mitarbeiter arbeiten in Ordner 1.
Programm 2 arbeitet in Ordner 2 (und löscht dort fleißig)

Nachtrag:
Hmm... Denkfehler... durch das Fehlen der Dateien in Ordner 2 kopiert das System immer wieder von Ordner 1 in Ordner 2. *lach*
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.525
Punkte für Reaktionen
1.360
Punkte
234
Ok, wieder von vorne.

Downloadterminal kopiert in Ordner1.
NAS kopiert von Ordner 1 in Ordner 2 und Ordner 3 und löscht in Ordner 1 die Dateien.

Mitarbeiter arbeiten im Ordner 2.
Programm 2 arbeitet in Ordner 3 (und löscht dort fleißig).

Ordner 2 muss durch die Mitarbeiter ab und zu aufgeräumt werden. Dies könnte man auch automatisiert machen, z.B. alles was älter als xx Tage ist, wird gelöscht.
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Ah, hast dir selber schon beantwortet wieso die umgekehrte Richtung nicht geht. :)

Und deine zweite Lösung ist doch auch nur meine mit einem extra Ordner mehr.
Aber ja, der Vorteil ist, dass es mit copy keine Race-condition geben wird zwischen Programm 2 und rsync. Also ja, ist die weniger fehleranfällige Variante.

Wie/wann Sachen in Ordner 2 gelöscht werden müssen weiß der Fragesteller wohl besser. Eventuell muss ja auch archiviert werden etc.
 

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Schonmal vielen Dank für eure superschnellen Antworten!

Das mit den 3 Ordnern wäre perfekt. Ist diese Lösung mit einem Syncprozess in der Diskstation möglich oder muss hier ein manuelles Skript erstellt werden?
Im Ordner 2 muss nicht archiviert oder gelöscht werden.
Könntet Ihr mir die Umsetzung für eure Lösung kurz erklären?

Vielen Dank im Voraus.
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Systemsteuerung > Aufgabenplaner eine zeitgesteuerte Aufgabe (Event getriggert nach Dateisystemänderung ist schwieriger).
Wenn die gemeinsamen Ordner alle auf Volume 1 liegen wäre das etwas wie (der Einfachheit halber als separate Befehle pro Zeile)
Code:
cp -a /volume1/ordner1/. /volume1/ordner2
cp -a /volume1/ordner1/. /volume1/ordner3
rm -rf /volume1/ordner1/

Sollte man zuerst mit Testordnern und Dateien probieren!
 

NormalZeit

Benutzer
Mitglied seit
15. Okt 2012
Beiträge
361
Punkte für Reaktionen
17
Punkte
24
Wenn das Script zeitgesteuert z.B. alle Minute läuft besteht das Risiko, dass wenn gerade eine Datei in den Ordner1 frisch reinkopiert wird, diese unvollständig im Ordner 2 und 3 ankommt und dann auch noch gelöscht wird.

Und was passiert bei einem angenommenen Intervall von 1 Minute, wenn die Kopiervorgänge länger dauern und das Script dann zweifach parallel läuft?

Also Vorsicht!

Um alle Randbedingungen einzuhalten ist es mit einem Einzeiler leider nicht getan.
 

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Super, ich werde es mal in einer Testumgebung versuchen.
Vielen Dank auch mit dem Hinweis der Risiken, das Skript würde ich alle 5min laufen lassen somit kann ich das Problem "kopiervorgang länger als intervall" auf jeden Fall aussschließen.
Das mit der nur halb kopierten Datei die dann gelöscht werden würde, wäre allerdings natürlich ein Problem.


Edit:
Ich habe das Skript wie von Fusion beschrieben erfolgreich ausprobiert. Dazu musste ich allerdings den rm Befehl noch in "rm -rf /volume1/ordner1/*" da ansonsten der komplette Ordner1 gelöscht wird.

Das Problem mit der nur halb kopierten Datei konnte ich auch nachstellen indem ich größere Datenmengen in Ordner1 kopiert habe und das Skript während dem Kopiervorgang immer wieder manuell gestartet habe. Hierbei wurden von 12 Dateien dann nur 11 an Ordner2 und Ordner3 übertragen.
Ich verstehe allerdings nicht ganz warum die anderen Dateien ohne Beschädigung übertragen worden sind.
 
Zuletzt bearbeitet:

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Hängt dann von den Anforderungen ab wie viel Aufwand man treiben muss, oder ob man ne ganz andere Lösung braucht.
Vielleicht reicht es ja morgens vor/nach der Arbeit den Sync zu machen, und vielleicht noch in der Mittagspause, dass man Kollisionen vermeiden kann.

Oder bei Programm 2 anfragen, ob die bitte importierte Dateien nicht löschen würden und nur neu hinzugekommen übernehmen etc.
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.525
Punkte für Reaktionen
1.360
Punkte
234
Ja, den Einzeiler halte ich hier auch für etwas gefährlich, sprich man muss schauen wie groß die Dateien sind, wie oft sie kopiert werden müssen, usw und dann abwegen wie man es sicher umsetzt.

Vielleicht wäre es ja schon ein Anfang nur Dateien zu kopieren, die älter als 5min sind, sowie die frischen Dateien erst in einen "Archivordner" zu schieben, dann erst von dort kopieren und nicht zu löschen. Das Löschen im Archiv kann man ja nach Dateialter (z.B. älter als 90 Tage) durch ein zweites Script vornehmen lassen.
 

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Beim Hersteller von Programm2 hatte ich schon direkt angefragt ob sowas nicht abänderbar ist oder in zukünfigten Updates berücksichtigt wird...leider haben die daran garkein Interesse.
Da wir hier aber nur von Dateigrößen von maximal 100KB sprechen und hierbei auch maximal 20 über den Tag verteilt gefällt mir der Vorschlag von Peter.
Ich würde somit nur Dateien kopieren die älter als 1min sind und dieses Skript alle 5min ausführen.

Edit:
Ich verwende nun folgendes Skript. Nun stellt sich aber für mich dir Frage...was passiert wenn wärend des kopieren eine Datei älter als 1min werden sollte? Diese wurde dann natürlich nicht kopiert und wird anschließend trotzdem gelöscht.

Rich (BBCode):
/bin/find /volume1/Bereich/Test/1/. -type f -mmin +1 -exec cp -a {} /volume1/Bereich/Test/2 \;
/bin/find /volume1/Bereich/Test/1/. -type f -mmin +1 -exec cp -a {} /volume1/Bereich/Test/3 \;
/bin/find /volume1/Bereich/Test/1/. -type f -mmin +1 -exec rm -rf {} /volume1/Bereich/Test/1/* \;
 
Zuletzt bearbeitet:

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Sorry dass ich nochmal nachhaken muss. Doch passt mein Skript generell? Und habt ihr vl noch ein Lösung für das Problem wenn wärend des Kopieren eine Datei älter als eine Minute werden sollte und somit gelöscht wird ohne dass sie vom Kopiervorgang erfasst wurde?

Vielen Dank im Voraus.
 

synfor

Benutzer
Sehr erfahren
Mitglied seit
22. Dez 2017
Beiträge
8.459
Punkte für Reaktionen
1.395
Punkte
288
Und habt ihr vl noch ein Lösung für das Problem wenn wärend des Kopieren eine Datei älter als eine Minute werden sollte und somit gelöscht wird ohne dass sie vom Kopiervorgang erfasst wurde?
Das Problem hast du nicht erst beim Löschen, sondern schon bei der zweiten Kopie. Du darfst find nur einmal benutzen um beide Kopien anzulegen und das Original zu löschen. Für die 2. Kopie könnte man auch move benutzen und spart sich so das separate Löschen.
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.525
Punkte für Reaktionen
1.360
Punkte
234
Ich würde das so auch nicht machen, sondern das eher so gestalten:

  1. If Abfrage, ob neue Dateien da sind und ob sie älter als 2min sind (nicht genau 2min, sondern älter). Falls ja, Punkt 2 und 3, ansonsten exit 0.
  2. cp => Datei aus Quelle zu Ordner1
  3. mv => Datei aus Quelle zu Ordner2
Und wenn die Daten super wichtig sind, macht man noch einen Ordner3, der als reines Notfallarchiv gilt. Dieses Archiv könnte man per Script automatisch aufräumen lassen (wenn älter als xx Tage => löschen).
 

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Nochmals vielen Dank für eure Tips.
Ich habe es jetzt folgendermaßen abgeändert.
Ordner 1 = Downloadterminal
Ordner 2 = Zwischenordner
Ordner 3 = Arbeitsordner Programm 1
Ordner 4 = Arbeitsordner PRogramm 2

Rich (BBCode):
/bin/find /volume1/Bereich/Test/1/. -type f -mmin +1 -exec mv {} /volume1/Bereich/Test/2 \;
cp -a /volume1/Bereich/Test/2/. /volume1/Bereich/Test/3
mv /volume1/Bereich/Test/2/. /volume1/Bereich/Test/4

Hierbei sollte ich das Problem durch den Zwischenordner umgehen.
Nun hätte ich nur noch die Frage ob ich in diesem Fall überhaupt mit find arbeiten müsste, da da beim Befehl move ja nur "fertige" Dateien verschoben werden oder?
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.135
Punkte für Reaktionen
898
Punkte
424
Auf was bezieht sich die Frage? Auf mv von 2 nach 4?
Oder auf das mv von 1 nach 2?

Bei 1 nach 2 brauchst du es für die Auswahl nach Alter der Daten.
Es gibt keine "fertigen" Dateien, nur welche die verschieden viel Platz beanspruchen.
Behalte das erste find, erspart Ärger.
 

Foradh

Benutzer
Mitglied seit
13. Jun 2019
Beiträge
22
Punkte für Reaktionen
1
Punkte
3
Ich meinte es bei mv von 1 nach 2. Mit den "fertigen" Dateien meinte ich, dass die Dateien vom Downloadterminal komplett übertragen wurden.
Hier habe ich es testweise einmal ohne find nur mit mv probiert und dabei große Daten in ordner 1 kopiert während das Skript immer wieder ausgeführt wurde. Dabei wurde keine Datei kopiert bzw. verschoben bevor diese komplett im Ordner 1 war. Somit war meine Überlegung, dass mv keine Dateien kopiert bzw. verschiebt welche sich gerade im Kopiervorgang befinden.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat