Zugriff auf Datei aus Hintergrundprozess nicht möglich

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 »

af0815 hat geschrieben:
Di 8. Dez 2020, 11:36
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.
Natürlich ist das nicht Pascal aber man kann erkennen, mit welchen Systemaufrufen lsof arbeitet und kann das damit sozusagen in Pascal nachbilden.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von PascalDragon »

af0815 hat geschrieben:
Di 8. Dez 2020, 11:36
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.
Ich glaube fliegermichl meinte damit, dass du schauen könntest was lsof macht (wobei ich ja eher in den Quellcode schauen würde, statt mit strace) und das dann in Pascal so ähnlich nutzen.
FPC Compiler Entwickler

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
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 »

Sorry, aber das ist mir zu hoch https://github.com/lsof-org/lsof und https://github.com/strace/strace. C ist nicht meine Spezialität, deswegen bin ich bei Pascal :D

Damit wird das mit Exceptions gemacht. Für eine einfache Absicherung mache ich sicher keine Doktorarbeit. Notfalls ein einfaches Open mittels FD, Leseversuch und Close FD. Das ganze schön mit Exception umgrenzt. Gehts ist es Ok, schmeisst es eine Exception, auch schön, dann ist Datei nicht bereit.
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!

Das geht noch einfacher. Mit dem IOresult

Code: Alles auswählen

var f : file,
     io : integer:

....
{$I- }
assignFile(f,'DateiName');
reset (f);
io  := ioresult;
closefile (f);
{$I+}
if io = 0 then showMessage ('OK') else showMessage ('IoError '+IntToStr(io));
....


Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
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 »

Und was ist der Vorteil gegenüber einer Behandlung mit try except ? Vor allen tritt das ja nicht immer auf. Vor allen, lese ich die Daten nicht selbst, sondern verwende image1.LoadFromFile.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von Maik81SE »

af0815 hat geschrieben:
Di 8. Dez 2020, 20:06
Und was ist der Vorteil gegenüber einer Behandlung mit try except ? Vor allen tritt das ja nicht immer auf. Vor allen, lese ich die Daten nicht selbst, sondern verwende image1.LoadFromFile.
Vielleicht nur ein blauer Gedanke...

Schon mit dem Gedankener einer LoadFromStream-Routine gespielt?
So nach dem motto, warum nicht als Stream behandeln?

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
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 »

Weil es mich nicht interessiert. Ich will das Bild anzeigen. try except ist so wie es aussieht die Möglichkeit ohne es weiter zu verkomplizieren. Wozu es jetzt extrem aufblasen.
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 »

Maik81SE hat geschrieben:
Di 8. Dez 2020, 20:35
af0815 hat geschrieben:
Di 8. Dez 2020, 20:06
Und was ist der Vorteil gegenüber einer Behandlung mit try except ? Vor allen tritt das ja nicht immer auf. Vor allen, lese ich die Daten nicht selbst, sondern verwende image1.LoadFromFile.
image1.LoadFromFile gibt's nicht. Das geht immer noch übers picture:
image1.picture LoadFromFile
Maik81SE hat geschrieben:
Di 8. Dez 2020, 20:35

Vielleicht nur ein blauer Gedanke...

Schon mit dem Gedankener einer LoadFromStream-Routine gespielt?
So nach dem motto, warum nicht als Stream behandeln?

Macht er doch schon. Implizit.

LoadFromFile ruft LoadFromStream auf.
Source lesen macht schlau.

Winni

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von Timm Thaler »

af0815 hat geschrieben:
Di 8. Dez 2020, 17:00
Damit wird das mit Exceptions gemacht. Für eine einfache Absicherung mache ich sicher keine Doktorarbeit. Notfalls ein einfaches Open mittels FD, Leseversuch und Close FD. Das ganze schön mit Exception umgrenzt. Gehts ist es Ok, schmeisst es eine Exception, auch schön, dann ist Datei nicht bereit.
Hm, hab ich für meinen Telegram-Bot gemacht. Der scannt auf Anfrage Dateien und gibt deren Inhalt wieder. Ist die Datei nicht lesbar, versucht er es dreimal, Exception ist drumrum. Trotzdem schmiert der Bot regelmäßig nach einiger Zeit ab, weil irgendwelche Kollisionen auftreten und das Abfangen nicht klappt.

Ich hab da auch noch keine dauerhafte Lösung dafür.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
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 »

Timm Thaler hat geschrieben:
Di 8. Dez 2020, 22:59
Ist die Datei nicht lesbar, versucht er es dreimal, Exception ist drumrum. Trotzdem schmiert der Bot regelmäßig nach einiger Zeit ab, weil irgendwelche Kollisionen auftreten und das Abfangen nicht klappt.
Bei mir schmiert nichts ab. Ich sehe auch keine Änderung beim Speicherverbrauch. Das ist stabil, Die Gefahr ist, wenn er mit einer Exception aussteigt, das ev. Resourcen gebunden bleiben. Das ist soweit ich es überblicke bei mir Ok.

@winni: ja, korrekt es geht über die picture Eigenschaft.
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 »

Ich hab das jetzt mal ausprobiert. Kleines Programm an der Console getippt und laufen lassen:

Code: Alles auswählen

{$mode objfpc}
program test1;
uses sysutils;
var f : file;
begin
 AssignFile(f, 'test.txt');
 ReWrite(f, 1);
 write('File opened (Press Enter)');
 ReadLn;
 CloseFile(f);
end.
Dann in der Bash folgenden Befehl: (strace schreibt seine eigene Ausgabe nach stderr)

Code: Alles auswählen

strace lsof test.txt 2> teststat.txt
Dann die Ausgabe geöffnet und nach "test.txt" gesucht. Da fand ich u.a. folgendes:

Code: Alles auswählen

readlink("/proc/4511/fd/3", "/home/michael/test.txt"..., 4096) = 22
lstat("/proc/4511/fd/3", {st_mode=S_IFLNK|0700, st_size=64, ...}) = 0
stat("/proc/4511/fd/3", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0
open("/proc/4511/fdinfo/3", O_RDONLY)   = 7
fstat(7, {st_mode=S_IFREG|0400, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff20763e000
read(7, "pos:\t0\nflags:\t0100002\n", 1024) = 22
close(7)                                = 0
lsof scheint als auch mit stat und lstat zu arbeiten. Warum das dann so umständlich über /proc/xxx gehandhabt wird, weiss ich nicht. Dafür kenn ich mich zu wenig mit den Linuxinterna aus.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Zugriff auf Datei aus Hintergrundprozess nicht möglich

Beitrag von PascalDragon »

fliegermichl hat geschrieben:
Mi 9. Dez 2020, 11:00
lsof scheint als auch mit stat und lstat zu arbeiten. Warum das dann so umständlich über /proc/xxx gehandhabt wird, weiss ich nicht. Dafür kenn ich mich zu wenig mit den Linuxinterna aus.
Das procfs enthält die Informationen über die laufenden Prozesse und bei jedem laufendem Prozess ist enthalten welche Dateideskriptoren offen sind und worauf sie sich beziehen. Es ist die einzige Möglichkeit wie man herausfinden kann, was ein anderer Prozess offen hat.
FPC Compiler Entwickler

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 »

Also iteriert lsof durch /proc/xx bis es einen Link auf test.txt findet und liest dann die entsprechenden Parameter aus?

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!

Zusätzlich zu PacalDragons Infos ist zu sagen, dass der Weg über das proc fs der letzte - und manchmal der einzige - Weg ist, um einen gelockten file eines gecrashten oder verstorbenen process zu löschen. Da kommt man mit einem simplen rm nicht weiter. Egal wieviele Parameter.

Ich gebe zu : etwas umständlich. Aber wenn man's verstanden hat sehr hilfreich.

Winni

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:

Bye the way:

Das proc fs ist die "Linux-Wunderwaffe" aus der man alles, aber auch (fast) alles auslesen kann.

Und wer meint, er weiss, was er tut, der darf dort auch Werte setzen.

Z.b. den TCP KeepAlive Wert auf 10 Minuten (=600 Sekunden) setzen:

Code: Alles auswählen

echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
Und wer genug Zeit hat, darf mal staunen, was seine CPU so alles kann.
Steht in

Code: Alles auswählen

/proc/cpuinfo

Winni

Antworten