Zugriff auf Datei aus Hintergrundprozess nicht möglich

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von af0815 »

Ich habe auf einem RasPi 4 einen FTP Server laufen, der mir Bilder von einem anderen RasPi empfängt. Das funktioniert bestens, die Dateien kommen an.

In einem Timer wird geprüft ob die Datei vorhanden ist, dann wird versucht die Datei in eine Imagekomponente einzulesen. Das schlägt manchmal fehl, da die Datei entweder noch nicht ganz übertragen ist oder vom FTP noch gelockt wird. Das die Übertragung dauert ist bei 20mpx Bildern nicht so ungewöhnlich.

Kann ich aus Lazarus heraus nativ ermitteln ob die Datei für mich frei/bereit zum Lesen ist ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von Socke »

af0815 hat geschrieben:
Fr 4. Dez 2020, 08:45
Kann ich aus Lazarus heraus nativ ermitteln ob die Datei für mich frei/bereit zum Lesen ist ?
Das machst du doch schon. Der einzig korrekte Weg ist, die Datei zu öffnen und den Fehlerfall korrekt zu behandeln.
Wenn du das Öffnen und Einlesen trennen willst, öffne die Datei mit einem TFileStream und lese den Inhalt dann darüber.

Alternativ müsstest du deinen FTP-Server anweisen, ein auswertbares Protokoll zu schreiben.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von theo »

Nur mal so ins Blaue:
Vielleicht könntest du mit diesem Code mal schauen, ob so der Status unterschieden werden kann:
https://wiki.freepascal.org/inotify
S.a. https://www.freepascal.org/~michael/art ... rwatch.pdf

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von af0815 »

Nein, da wird die Sache innerhalb von inotify abgewickelt und nur als Info im Callback mitgegeben. Inotify ist genau das was ich nicht als zusätzlichen Dämonen haben will. Ich bekomme schon einen Callback vom Snap7-System, das die Datei da ist. Also so wie bei Inotify. Noch dazu kenne ich sonst alles. Dateiname, Ort, etc. ist alles geklärt. Auch das die Datei per FTP bereits übertragen wurde, nur manchmal wird die nicht gleich zum Lesen freigegeben. War ursprünglich nicht, ist jetzt neu aufgetaucht.

Die Artikel von Michael kenne ich mittlerweile alle :-) Ich habe mich auch schon mit Inotify und Konsorten relativ auseinandersetzen dürfen.

Edit: Einen nfangspunkt habe ich entdeckt:
fpstat (man 2 stat)

mal sehen ob das was bringt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

AndreasMR
Beiträge: 98
Registriert: Di 4. Aug 2015, 15:29
OS, Lazarus, FPC: Linux, Raspbian, Windows
CPU-Target: 64/32 Bit

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von AndreasMR »

Hallo af0815,

ich sehe 2 Ansätze:
1. Es wird systemseitig möglicherweise eine temporäre Datei gefüllt, bis diese Datei abgeschlossen ist. Diese temporäre Datei solltest Du erst gar nicht versuchen auszulesen. Die Datei wird nach Abschluss umbenannt. Erst dann macht ein Lesevorgang Sinn.
2. Die Datei wächst während der Erstellung. Da würde ich in regelmäßigen - aber hinreichend großen Abständen - die Dateigröße auslesen. Sobald diese nach 2 oder 3 Versuchen konstant bleibt, sollte die Datei wohl vollständig und somit zum Öffnen / Bearbeiten / Kopieren etc. bereit sein.


Beste Grüße

Andreas
Ubuntu 14.04 LTS / Raspbian / Windows: Lazarus ab 0.9 bis 3.0

AndreasMR
Beiträge: 98
Registriert: Di 4. Aug 2015, 15:29
OS, Lazarus, FPC: Linux, Raspbian, Windows
CPU-Target: 64/32 Bit

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von AndreasMR »

Hallo af0815,

ich sehe 2 Ansätze:
1. Es wird systemseitig möglicherweise eine temporäre Datei gefüllt, bis diese Datei abgeschlossen ist. Diese temporäre Datei solltest Du erst gar nicht versuchen auszulesen. Die Datei wird nach Abschluss umbenannt. Erst dann macht ein Lesevorgang Sinn.
2. Die Datei wächst während der Erstellung. Da würde ich in regelmäßigen - aber hinreichend großen Abständen - die Dateigröße auslesen. Sobald diese nach 2 oder 3 Versuchen konstant bleibt, sollte die Datei wohl vollständig und somit zum Öffnen / Bearbeiten / Kopieren etc. bereit sein.


Beste Grüße

Andreas
Ubuntu 14.04 LTS / Raspbian / Windows: Lazarus ab 0.9 bis 3.0

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von af0815 »

ad 1 ) Das ist keine temporäre Datei mehr, sondern dürfte im Anschluss passieren, beim Umkopieren.

ad 2 ) Ich bekomme über IPC vom Sender die Nachricht, das der Vorgang abgeschlossen ist. Daher sein Prozess ist zurückgekehrt nachdem sein Prozess den Transfer beendet hat und die Verbindung auch wieder geschlossen hat. Das mit der Dateigröße beobachten, ist meiner Meinung nach auch nicht der letzte Schrei und daher beste Lösung. Da kann ich so wie bisher das ganze über eine gefangene Exception genau so gut auswerten, der Ansatz ist IMHO um nichts schlechter :-) Vor allen schlägt das Verfahren fehl, wenn die ganze Dateigröße zuerst allokiert wird und dann die Daten in Chunks eingepflegt werden. Ist in dieser Implementation zwar nicht der Fall, ist aber trotzdem bei so indirekten Beobachten zu berücksichtigen.

Wenn ich da was ändere, dann nur über die direkte Abfrage des Status der Datei. Ich bin nur noch nicht dazugekommen mich tiefer in die FPC Teile dort einzuarbeiten. Aber spätestens in den Weihnachtsferien werde ich da mehr Zeit finden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von Swirl »

Hallo af0815,

Warum baust du dir nicht nicht eine eigene »Transaktion« bzw. ein Handshake? Nach Übertragen der Bilddatei eine leere Datei gleichen Namens (ohne Extension) hinterherschieben. Den Rest kannst du dir denken...

Gruß,
Michael
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von af0815 »

Ich habe eine Transaktionsbestätigung über IPC >(oder auch Handshake genannt). Warum soll ich noch was dazubauen ? Es geht mir nur darum ob ich feststellen kann ob ich bereits auf die Datei zugreifen darf. Die Übertragung ist wie in den Posts vorher sicher angeschlossen.

Ansonsten bau ich nicht noch was Fehleranfälliges dazu, wenn ich es aktuell auch mit try/except abfangen kann. Eigentlich dürfte sich das ganze auf fpstat reduzieren lassen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Swirl
Beiträge: 93
Registriert: Fr 7. Aug 2015, 14:05
OS, Lazarus, FPC: Win 10/11/ Mint 21.3 / Lazarus 30 / FPC 3.2.2
CPU-Target: x86_64, ARM Cort.-A7
Wohnort: Schwerte NRW

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von Swirl »

Du könntest trotzdem mal versuchen, 'n Dummy hinterherzuschieben und testen, ob bei Eintreffen desselben (und aus eben diesem Grund), das Blocken der Bilddatei aufgehoben wird. Ist mir schon klar, dass das Hardcore ist - aber du machst das schon... :wink:
p.s. Du denkst auch schon daran, dass der Raspi nur relativ langsam »wegschreibt« und du ggf. 'n Buffering-Problem hast?
Oder mit Linux-Bordmitteln (lsof) mal schauen, wer ggf. den Daumen auf der Datei hat.
=> Mint 21.3 “Virginia” - Win 10/11 - Lazarus 3.0 - FPC 3.2.2

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von af0815 »

Ich kann dort nichts mal,... Das ist eine Applikation im Einsatz. Wennst du das am Schreitisch versuchst läuft das ewig ohne Probleme. Kein herumstochern mit Vermutungen.

Der Effekt ist auch schon auf Debian mit SSD aufgetreten, also nicht nur RasPian. BTW. RasPi 4 mit SSD läuft auch zufriedenstellen. Komplett ohne SD Karte.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von Winni »

Hi!

Schon mal mit Linux lsof beschäftigt?

Zeigt Dir an wer wo noch nen offenen "file"-pointer hat.
Das können Dateien, FIFOs, Geräte, das Proc-system oder sonstwas sein.
Dateiname, Verzeichnis, Owner, Dateiname etc - wird alles angezeigt.

Auch zur Not einsetzbar, wenn irgend ein wildgewordener Process die Platte vollschreibt.
Und man nicht weiss, wer es ist.
Wie z.B. ab und zu frühe Versionen von TightVNC.

Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von af0815 »

In der Tat habe mich mit stat (fpstat) beschäftigt, bin da dann auf lsof gestossen. Dort bin ich hängengeblieben weil ich noch nicht herausgefunden habe, wie ich nativ drauf zugreifen kann. Über TProcess will ich nicht gehen, der Zugriff sollte nativ erfolgen.

Was ich mir auch ansehen wil, ist wie das Bild in der Kompnente (TImage) geladen wird. Wie gesagt, was für die Weihnachtsferien :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von fliegermichl »

Versuch mal

Code: Alles auswählen

strace lsof
Da kann man recht schön sehen welche Systemaufrufe da passieren

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von af0815 »

fliegermichl hat geschrieben:
Di 8. Dez 2020, 09:29
Versuch mal

Code: Alles auswählen

strace lsof
Da kann man recht schön sehen welche Systemaufrufe da passieren
Das ist aber nicht nativ Pascal. Ich kenne die meisten Tools auf der Kommandozeile, ich will aber NICHT mit TProcess arbeiten müssen, sondern nur nativ in Pascal. Für STAT gibt es fpstat zum Beispiel.

Ansonsten arbeite ich einfach mit try except weiter und fange die Exception und werte das aus.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten