Gelon Geschrieben 6. Oktober 2008 Teilen Geschrieben 6. Oktober 2008 Hallo zusammen, ich habe ein kleines Problem mit Samba: Ich habe unter Ubuntu 8.04 Server einen Samba-Server eingerichtet, und zwar sollen Benutzer in ein Verzeichnis Dateien kopieren, welche dann automatisiert weiterverarbeitet werden, d.h. das Verzeichniss wird mit iwatch (ein Perl-Programm, welches inotify verwendet) überwacht und bei dem Auftreten der entsprechenden Events werden die Dateien bearbeitet. Jetzt habe ich das Problem, dass Samba, wenn mehrere Dateien auf einmal kopiert werden, zuerst für jede zu übertragende Datei im Ziel-Verzeichnis eine leere Datei anlegt, die dann erst im laufe der Zeit gefüllt wird. Ich darf die Datei aber natürlich erst dann weiterverarbeiten, wenn die Übertragung komplett abgeschlossen ist. Kann man denn irgendwie überprüfen, ob die vorhandene Datei schon fertig übertragen ist oder ob die Übertragung noch läuft. Da sehr viele Dateien in sehr kurzer Zeit verarbeitet werden müssen kann ich auch nicht bei jeder Datei eine gewisse Zeitspanne warten um zu überprüfen, ob sie noch wächst. Gibt es da andere Möglichkeiten? Gruß Gelon Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 6. Oktober 2008 Teilen Geschrieben 6. Oktober 2008 ich habe die problematik im falle einer schnittstelle mal selbst gehabt (ohne inotify) und so gelöst, dass ich zusätzlich zum notify des erstellens der datei eine prüfung auf änderung der dateigröße jeweils alle 30 sekunden gemacht habe. würde die datei nach dem befüllen 30 sekunden nicht mehr berührt, konnte man davon ausgehen, dass sie fertig angelegt (kopiert, übertragen) war. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Enno Geschrieben 6. Oktober 2008 Teilen Geschrieben 6. Oktober 2008 Linuxsystemprogrammieren Blockieren und Sperren von Dateien Deadlocks dort die Funktion: F_GETLK Damit bekommst du herraus ob die Datei gelockt. Also zum schreiben gesperrt ist. Sollte jdes Vernünftige Programm machen. Und solange deine andere Applikation die Schreibsperre drin hat darfst du es eben nicht lesen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gelon Geschrieben 7. Oktober 2008 Autor Teilen Geschrieben 7. Oktober 2008 Danke erstmal für deinen Tipp mit F_GETLK. Ich bin jetzt nur nicht der super C-Programmierer , und irgendwie will es nicht so recht klappen. Ich habe mal zum testen folgendes geschrieben: #include <stdio.h> #include <fcntl.h> int main() { int fd; struct flock sperre; fd = open("/tmp/bla.txt", O_CREAT | O_WRONLY); fcntl(fd, F_GETLK, &sperre); if(sperre.l_type == F_UNLCK) { printf("Keine Sperre\n"); } else if(sperre.l_type == F_RDLCK) { printf("Lesesperre\n"); } else if(sperre.l_type == F_WRLCK) { printf("Schreibsperre\n"); } return 0; } Wenn ich das Programm starte, erfolgt aber überhaupt keine Ausgabe??? Die Datei "/tmp/bla.txt" existiert. Ich habe mal versucht, die Datei zu sperren: #include <stdio.h> #include <fcntl.h> int main() { int fd; struct flock sperre; fd = open("/tmp/bla.txt", O_CREAT | O_WRONLY); sperre.l_start = 0; sperre.l_whence = SEEK_SET; sperre.l_len = 0; sperre.l_type = F_RDLCK; int sperror=fcntl(fd, F_SETLK, &sperre); printf("Fehler %d\n", sperror); return 0; } Wenn ich das Programm aufrufe wird immer "-1" ausgegeben, obwohl die Datei existiert und von keinem anderen Programm genutzt wird. Könnt ihr mir vielleicht sagen was ich falsch mache, ich blicks irgendwie nicht! Danke und Gruß Gelon Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.disk Geschrieben 10. Oktober 2008 Teilen Geschrieben 10. Oktober 2008 Was man da draussen ebenfalls sehr oft sieht ist die Verwendung von lock-Dateien oder irgendwelchen "Signal"-Dateien. Funktionieren tut's so (am Beispiel der Datei xyz.txt): lock-Datei: zuerst wird die Datei xyz.txt.lock mit leerem Inhalt erstellt, danach die Datei kopiert. Sobald man fertig ist löscht man die .locksignal-Datei: die Datei wird kopiert und sobald man fertig ist die Datei xyz.txt.done mit leerem Inhalt erstellt. Sollte klar sein worauf dann Dein Programm/Skript achten muss ob die Übertragung bereits fertig ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.