Bash: Feststellen, ob eine Datei geöffnet ist
Servus zusammen, wie kann man denn in einem Shell-Skript feststellen, ob ein (anderer) Prozeß gerade in eine Datei hinein schreibt? Hintergrund ist vereinfacht folgendes Vorhaben: Ich möchte per Samba die Verzeichnisse /in /out exportieren. Die User sollen PDF-Dateien in /in reinlegen können, und in /out sollen die Dateien in einzelne Seiten zerlegt wieder zurückgegeben werden. Dabei könnte es doch jetzt passieren, daß das Skript eine Datei anfaßt, obwohl der User gerade noch am hochladen, sprich: hineinschreiben ist. Das muß ich natürlich verhindern. Wie geht das? -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Thu, February 24, 2011 8:49 am, Andre Tann wrote:
wie kann man denn in einem Shell-Skript feststellen, ob ein (anderer) Prozeß gerade in eine Datei hinein schreibt?
Hintergrund ist vereinfacht folgendes Vorhaben: Ich möchte per Samba die Verzeichnisse
/in /out
exportieren. Die User sollen PDF-Dateien in /in reinlegen können, und in /out sollen die Dateien in einzelne Seiten zerlegt wieder zurückgegeben werden.
Dabei könnte es doch jetzt passieren, daß das Skript eine Datei anfaßt, obwohl der User gerade noch am hochladen, sprich: hineinschreiben ist. Das muß ich natürlich verhindern.
Wie geht das?
Schau Dir mal inotify an. regards, Christian -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Thu, 24 Feb 2011 08:49:26 +0100
schrieb Andre Tann
Servus zusammen,
wie kann man denn in einem Shell-Skript feststellen, ob ein (anderer) Prozeß gerade in eine Datei hinein schreibt?
Hintergrund ist vereinfacht folgendes Vorhaben: Ich möchte per Samba die Verzeichnisse
/in /out
exportieren. Die User sollen PDF-Dateien in /in reinlegen können, und in /out sollen die Dateien in einzelne Seiten zerlegt wieder zurückgegeben werden.
Dabei könnte es doch jetzt passieren, daß das Skript eine Datei anfaßt, obwohl der User gerade noch am hochladen, sprich: hineinschreiben ist. Das muß ich natürlich verhindern.
Wie geht das?
man lsof(8), suche mal den Parameter +d, das sollte helfen. -Dieter -- Dieter Klünter | Systemberatung http://dkluenter.de GPG Key ID:DA147B05 53°37'09,95"N 10°08'02,42"E -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Dieter Kluenter, Donnerstag 24 Februar 2011:
man lsof(8), suche mal den Parameter +d, das sollte helfen.
Damit könnte ich die Sache wohl in der Tat so angehen, wie ich in der Frage geschrieben habe. Allerdings könnte es ja sein, daß eine Übertragung mal abbricht oder so, und dann wäre die Überprüfung, ob sich Inhalt und/oder Größe seit x Minuten, vermutlich doch sinnvoller. Danke aber für den Hinweis, denn das hilft mir schon beim Entwickeln des Skriptes. Viele Grüße! -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am 24.02.2011 um 10:37 schrieb Andre Tann:
Damit könnte ich die Sache wohl in der Tat so angehen, wie ich in der Frage geschrieben habe. Allerdings könnte es ja sein, daß eine Übertragung mal abbricht oder so, und dann wäre die Überprüfung, ob sich Inhalt und/oder Größe seit x Minuten, vermutlich doch sinnvoller.
lsof listet alle Dateien auf, die geöffnet sind. Was interessiert Dich, ob der Schreibzugriff erfolgreich war, oder nicht? Da kümmert sich doch das Betriebssystem drum. Lg Michael-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Michael Post, Donnerstag 24 Februar 2011:
lsof listet alle Dateien auf, die geöffnet sind. Was interessiert Dich, ob der Schreibzugriff erfolgreich war, oder nicht? Da kümmert sich doch das Betriebssystem drum.
Würde mich deswegen interessieren, weil ja die Übertragung abbrechen kann, geht ja schließlich via Samba übers Netzwerk, der Client kann abstürzen, usw. Dann will ich nicht ne halbe PDF-Datei anfassen, sondern warten, bis das Ding wirklich übertragen ist. Oder ist das zu weit gedacht? Es kommt in diesem Fall nicht drauf an, daß die Datei möglichst schnell bearbeitet wird, sondern darauf, daß es überhaupt passiert, und daß es zuverlässig passiert. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Donnerstag, 24. Februar 2011, 11:05:32 schrieb Andre Tann:
Michael Post, Donnerstag 24 Februar 2011:
lsof listet alle Dateien auf, die geöffnet sind.
Was interessiert Dich, ob der Schreibzugriff erfolgreich war, oder nicht? Da kümmert sich doch das Betriebssystem drum.
Würde mich deswegen interessieren, weil ja die Übertragung abbrechen kann, geht ja schließlich via Samba übers Netzwerk, der Client kann abstürzen, usw. Dann will ich nicht ne halbe PDF-Datei anfassen, sondern warten, bis das Ding wirklich übertragen ist.
Oder ist das zu weit gedacht?
Es kommt in diesem Fall nicht drauf an, daß die Datei möglichst schnell bearbeitet wird, sondern darauf, daß es überhaupt passiert, und daß es zuverlässig passiert.
Ich glaube, da stößt du auf ein Problem, das mit technischen Mitteln nicht mehr zu fassen ist. Z.B. könnte eine Datei technisch ok sein, aber der Benutzer hat eine Seite vergessen und möchte den Vorgang ein paar Minuten später wiederholen. Vermutlich kannst du nicht mehr leisten als eine technische Abfrage: Ist die Datei jetzt im Augenblick noch im Schreibzugriff oder nicht? Dazu hast du ja schon Vorschläge bekommen. Alles andere würde wohl eine zusätzliche Kommunikationsebene erfordern. Jürgen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Juergen Langowski, Donnerstag 24 Februar 2011:
Ich glaube, da stößt du auf ein Problem, das mit technischen Mitteln nicht mehr zu fassen ist.
Z.B. könnte eine Datei technisch ok sein, aber der Benutzer hat eine Seite vergessen und möchte den Vorgang ein paar Minuten später wiederholen.
Klar, dagegen kann man nichts machen, das ist dann einfach ein neuer Vorgang. Ich werd das jetzt einfach mal aufsetzen und schauen, was passiert. Danke an alle für die Tips! -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, das Hinter dem Subject stehende Thema würde mich auch interessieren. Wir haben hier auch einen pdf-Drucker mittels Samba zu laufen. From: "Andre Tann" Sent: Thursday, February 24, 2011 12:04 PM
Juergen Langowski, Donnerstag 24 Februar 2011:
Ich glaube, da stößt du auf ein Problem, das mit technischen Mitteln nicht mehr zu fassen ist.
Z.B. könnte eine Datei technisch ok sein, aber der Benutzer hat eine Seite vergessen und möchte den Vorgang ein paar Minuten später wiederholen.
Klar, dagegen kann man nichts machen, das ist dann einfach ein neuer Vorgang. Ich werd das jetzt einfach mal aufsetzen und schauen, was passiert.
Gibt es ein Tutorial, wenns fertig ist? Wirst Du das Polling mit cron und das Zerlegen mit pdftk machen oder gibt es da weitere Alternativen, die ich noch nicht kenne? Gruß, Alex -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo,
Allerdings könnte es ja sein, daß eine Übertragung mal abbricht oder so, und dann wäre die Überprüfung, ob sich Inhalt und/oder Größe seit x Minuten, vermutlich doch sinnvoller.
Siehe "man 1 find", das hat einige Optionen, um festzustellen, seit wann eine Datei nicht mehr "angefasst" oder geändert wurde, z.B. mit etwas wie "find /in -cmin +1" oder ähnlichem. Das führt aber zu Verzögerungen bis zu einer Minute. Daher ggf. mit "stat" die genauen Daten abfragen und dann damit arbeiten. Gruß Johannes Meixner -- SUSE LINUX Products GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany AG Nuernberg, HRB 16746, GF: Markus Rex
Am 24. Februar 2011 08:49 schrieb Andre Tann
wie kann man denn in einem Shell-Skript feststellen, ob ein (anderer) Prozeß gerade in eine Datei hinein schreibt?
Pragmatisch und portabel: Wenn sich die Dateigröße nach einer Sekunde nicht ändert, schreibt niemand mehr. Gruß Martin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Martin Schröder, Donnerstag 24 Februar 2011:
Pragmatisch und portabel: Wenn sich die Dateigröße nach einer Sekunde nicht ändert, schreibt niemand mehr.
So ähnlich hatte ich auch schon überlegt: wenn die ctime mehr als fünf Minuten in der Vergangenheit liegt, dann hat die Datei auch niemand mehr in der Hand. Leider kann man mit find nur taggenau suchen. Vielleicht kann ich mit -mmin was bauen. -- Andre Tann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (8)
-
Alex Winzer
-
Andre Tann
-
Christian Brabandt
-
Dieter Kluenter
-
Johannes Meixner
-
Juergen Langowski
-
Martin Schröder
-
Michael Post