Dateiaustausch zwischen Prozessen
-
Was ist die gängige Methode unter Linux große Dateien zwischen Prozessen auszutauschen?
Das Hauptproblem ist festzustellen wann die Datei komplett ist.
Der schreibende Prozess ist beispielsweise ein ftp daemon,
der lesende Prozess ist ein Userprogramm.Dass eine Datei vorhanden ist stelle ich über dnotify/inotify fest.
Jetzt brauch ich noch eine möglichkeit festzustellen ob der daemon
noch ein write handle auf die Datei hält bzw. wann global kein Handle
mehr auf die Datei gehalten wird.
Dazu wollte ich eigentlich lsof benutzen, allerdings erhält das
Userprogramm aus Berechtigungsgründen keine Infos über die
handles des daemon.Momentan hab ich ich nen Workaround gebastelt, der auch stabil funktioniert,
aber ich such noch ne saubere Methode.
-
Was ist die gängige Methode unter Linux große Dateien zwischen Prozessen auszutauschen?
-
wie meinst du das genau?
-
wie du schon bemerkt hast, ist es nicht möglich, herauszufinden, wie oft eine datei geöffnet wurde.
vielleicht musst du dein design etwas ändern. du könntest den server ein signal an den anderen prozess senden lassen, das ihm mitteilt, wann die datei geschlossen wurde. der nachteil ist, dass du damit immer noch nicht weißt, ob nicht ein weiteres programm in die datei schreibt.
interessant ist, dass der titel des beitrags nicht zum inhalt passt.
-
besserwisser schrieb:
wie du schon bemerkt hast, ist es nicht möglich, herauszufinden, wie oft eine datei geöffnet wurde.
möglich ist es (lsof). es wird nur durch das berechtigungskonzept verhindert
besserwisser schrieb:
du könntest den server ein signal an den anderen prozess senden lassen, das ihm mitteilt, wann die datei geschlossen wurde.
der servercode lässt sich nicht ändern
zwar ist er open source aber in dem code eines sourceforge projekts rumzupfuschen mit dem ich nix zu tun habe wär auch keine saubere lösungbesserwisser schrieb:
der nachteil ist, dass du damit immer noch nicht weißt, ob nicht ein weiteres programm in die datei schreibt.
davon könnte ich ausgehen aber etwas lsof-ähnliches wäre sicherer
besserwisser schrieb:
interessant ist, dass der titel des beitrags nicht zum inhalt passt.
[/quote]
dann erklär mir mal wie du zwischen prozessen dateien austauschen willst
ohne zu synchronisieren, denn darum geht es hier
-
deshalb ist es ja nicht möglich. lsof liest die informationen über offene dateien der prozesse aus /proc. das ist sehr unständlich, weil du nicht einfach nach einer datei suchen kannst, sondern bei jedem prozess nachsehen musst, ob er die datei offen hat oder nicht. unabahängig davon hast du eben nicht die rechte, das zu tun.
klar lässt sich der server code ändern. das ist der sinn von open source. zumindest einer der beiden großen. du kannst jedes programm an deine ansprüche anpassen. wenn es eine sinnvolle funktion ist, könnte sie vielleicht sogar in das projekt offiziell aufgenommen werden. du könntest eine erweiterung für das server programm schreiben, damit man plugin laden kann, die dann zu verschiedenen ereignissen im server programm ausgeführt werden. zb eben ein "sende signal an prozess x" plugin.
da du die datei sowieso grundsätzlich per inotify überwachst, könntest du, ausgehend vom create, immer mitzählen, wann eine datei geöffnet bzw. geschlossen wurde. wenn du davon ausgehst, dass der server die datei erzeugt, schreibt, schließt und nie wieder schreibend öffnet, reicht es sogar, einfach per inotify den close event abzuwarten.
ich bin mir hier aber nicht sicher, ob es nicht zu synchronisationsproblemen kommen kann, da der create event bei deinem programm ankommen könnte, nachdem der server die datei schon geschlossen hat. bei kleinen dateien könnte das vielleicht passieren.die pluginmethode wäre auf jeden fall die sauberste.
-
besserwisser schrieb:
klar lässt sich der server code ändern. das ist der sinn von open source. zumindest einer der beiden großen. du kannst jedes programm an deine ansprüche anpassen. wenn es eine sinnvolle funktion ist, könnte sie vielleicht sogar in das projekt offiziell aufgenommen werden. du könntest eine erweiterung für das server programm schreiben, damit man plugin laden kann, die dann zu verschiedenen ereignissen im server programm ausgeführt werden. zb eben ein "sende signal an prozess x" plugin.
theoretisch geb ich dir recht aber in der praxis ist das viel zuviel aufwand für viel zuwenig nutzen
falls niemand mehr ne andere idee hat schreib ich einfach noch nen dritten prozess der mit root rechten läuft und den client mit ner named pipe über neue dateien informiert
dann kann ich lsof benutzen und der clientprozess läuft weiterhin mit userrechten