[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Script geht nicht



Irgendwie drehen wir uns im Kreis.

> Nein, schau Dir nochmals den Code an. Ich habe ihn nur noch
> sinngemaesz vor Augen, der war etwa so:
> 
>   for DATEI in $DATEIEN; do
>     mv $DATEI $ZIEL
>   done

Jup, und weil ein mv auf dem gleichen Dateisystem keine probleme mit
offenen Dateien hat.

> Und ich empfahl sinngemaesz zwei Verbesserungen:
> 
>   for DATEI in $DATEIEN; do
>     fuser "$DATEI" > /dev/null 2>&1 || mv "$DATEI" $ZIEL
>   done

brauchst du deinen code so nicht abändern. Weil es überflüssig ist. Du
hast danach Argumentiert das du nachfolgende prozesse nichts halbgares
geben möchtest. Aber es kommt ja danach nichts. Daher ist dein fuser so
überflüssig.

Sollte es ein Remote-Dateisystem sein. fuser hilft dir nicht da du nur
einsehen kannst was dein lokaler PC für Zugriffe hat und du nicht
einsehen kannst ob ein anderer PC eine datei offen hat oder nicht.

> Von Zugriffen auf die Quelle war keine Rede. Ich rede davon, dasz
> ich erst die Endgueltigkeit der Quelle pruefe, bevor ich sie ins
> Ziel verschiebe (oder auch kopiere).

Genau davon habe ich ja auch geredet und das deine fuser Überprüfung
auch weg lassen kannst.

> In dem Skript kam nichts danach;

Deswegen musst du das "mv" ja auch nicht absichern.

> Es ging um die Prozesse, die die Weiterverarbeitung _im_ _Ziel_
> vornehmen, nicht in der Quelle. Denen sollte nichts Unfertiges
> vorgeworfen werden.

Es wurde nirgendswo irgendetwas genannt von diesen nachfolgenden
prozessen. Und man muss auch sagen. Damit muss jede Software klar kommen
wenn es noch unfertige Dateien versucht zu lesen. Kein Programm sollte
abstürzen oder irgendetwas undefiniertes tun weil eine Datei nur halb
fertig geschrieben wurde. Und nebenbei. Mit deinem "fuser" aufruf
verhinderst du das auch nicht.

Wenn es ein anderes Dateisystem ist, wird die Datei auch kopiert, und
Prozesse haben dort kurzzeitig nicht fertige Dateien. Wenn du selbst das
absichern möchtest müsstest du Temp Dateien anlegen, dateien erst in
einer Temp-Datei kopieren und dann umbennen.

Irgendwie vergeudest du deine Zeit mit einer vermeintlichen verbesserung
die einfach keine ist. Wenn du jeden Fall abdecken möchtest was du
glaubst müsse man tuen würdest du morgen noch nicht fertig sein. Man
sollte auch mal Pragmatisch sein.

> Sonst haette ich ja zu folgendem angeregt:
> 
>   for DATEI in $DATEIEN; do
>     if ! fuser "$DATEI" > /dev/null 2>&1; then
>       mv "$DATEI" $ZIEL
>       $BEFEHL_1 $PARAMETER_1
>       $BEFEHL_2 $PARAMETER_2
>       ...
>       $BEFEHL_N $PARAMETER_N
>     fi
>   done

Das ist nicht mehr und nicht weniger Richtig. Dir ist schon klar das du
auf einem Multi-Tasking System bist und nicht unter MS-DOS arbeitest?

Es gibt nirgendswo eine Garantie das zwischen $BEFEHL_1 und $BEFEHL_2
ein anderer Prozess etwas öffnet, liest oder verändert. Es kann sogar
durchaus sein das ein anderer Prozess noch vor dem "mv" deine datei
schreibend öffnet. Oder die datei nach deinem fuser aufruf auf einmal
gelöscht wurde, und alle nachfolgenden befehle mit einer nicht
existierenden Datei arbeiten wollen.

Dein Code würde ich als typischen Placebo-Effekt einordnen. Er bewirkt
nicht wirklich irgendetwas. Er verhindert gar nichts. Und erhöht
komplexität beim schreiben und beim nachherigem verstehen was überhaupt
warum gemacht wird. Allerdings glaubst du es würde etwas verbessern.

Zumal ich sogar noch ankreiden könnte das du einfach nach ziele
verschiebst selbst wenn die zeildatei schon existieren würde, und du
hier einfach dateien überschreibst.

Zum anderen dürfen bei deiner fuser abfrage nichtmal lese zugriffe auf
einer Datei sein, die volkommen egal wären.

Deswegen ist es oft besser nach dem KISS-Prinzip zu arbeiten. Versenden
der Datei und danach verschieben und fertig. Dein simples fuser bringt
dir weniger nutzen als du glaubst. Und wenn du schon glaubst dich um
soetwas simples kümmern zu müssen könnte ich dir noch sehr viel mehr an
den Kopf verwerfen was du alles noch beachten müsstest.


Reply to: