linux-l: Frage: Koordinierung von Shell-Prozessen

Mirko Dziadzka dziadzka at ai-lab.fh-furtwangen.de
Mo Sep 22 16:45:16 CEST 1997


On Mon, Sep 22, 1997 at 04:22:23PM +0200, Michael_Feldbinder at dara.de wrote:
> 
> Hi LXer!
> 
> Ich habe wieder eine kleine Frage: Wie kann ich Shell-Prozesse beim
> konkurrierend Zugriff auf eine Datei koordinieren?

Locking macht man immer mit atomaren Operation. Davon gibt es auf
Dateisystemebene nicht sehr viele.  Entweder du schreibst eine kleines
C-Programm welches das locking auf C-Ebene uebernimmt (man lockf, flock,
... ), oder du benutzt auf Shell-Ebene das Kommando ln. Eine (harten)
Link anzulegen ist laut Posix eine atomare Operation (funktioniert leider
nicht immer ueber nfs :-()

Also ungefaher so:

LOCKFILE=/tmp/$LOGNAME.to_kill.lock
trap "rm -f ${LOCKFILE}.$$" 0

echo $$ > ${LOCKFILE}.$$

while ! ln ${LOCKFILE}.$$ $LOCKFILE 2> /dev/null  ; do
	echo wait for unlock to_kill
	echo file is locked by `cat $LOCKFILE`
	sleep 1
done

... do the hard work

rm $LOCKFILE
exit 0


> Das Problem (die Aufgabe ;-)
> ****************************
> Damit haben wir aber das Problem, daß 4 Prozesse sich um die Datei "
> $HOME/tmp/to_kill_liste" zanken. Also versuchte ich die üblichen Wege wie
> bei der DB-programmierung mit Filelocking:
> 
> ...
>   while [ -f $HOME/tmp/to_kill.lock ] ; do
>     echo wait for unlock to_kill proc
>     sleep 1
>   done
> 
>   touch $HOME/tmp/to_kill.lock
>   echo echo $* >> $HOME/tmp/to_kill_liste
>   echo kill -9 $$ >> $HOME/tmp/to_kill_liste
>   rm $HOME/tmp/to_kill.lock
> ...
> Wie man sieht ist natürlich eine zeitliche Lücke enthalten (Nach dem
> Erkennen "kein Flag-File da" bis zum erzeugen dieser Datei) und eine
> Sekunde warten für den nächsten Sperrversuch ist auch nicht sonderlich
> elegant (sleep 0.1 hätte gereicht, oder?).
> 

-- 
++++++++++++ Linux - das beste Textadventure aller Zeiten  ++++++++++++
PGP-Key available via finger -l dziadzka at zeus.ai-lab.fh-furtwangen.de or 
         http://www.ai-lab.fh-furtwangen.de/~dziadzka/pgp.asc
PGP fingerprint =  68 72 47 A7 4E 71 25 F0  56 02 2D 06 58 52 7D AD





Mehr Informationen über die Mailingliste linux-l