[linux-l] Lock-Dateien vs. Lock-Verzeichnisse
Benjamin Schieder
blindcoder at scavenger.homeip.net
Mo Jul 17 07:02:44 CEST 2006
On 17.07.2006 11:30:31, Peter Ross wrote:
> BTW: mkdir und open sind beide in der libc und auf Kernelebene tut mkdir
> das Gleiche wie open - testen, ob das Directory existiert und dann ein
> Directory anlegen.
Ja, aber das ist in Ordnung so. Beim Locking geht es ja nur darum, dass
der Prozess, welcher einen Lock haben will, zwischen dem Oeffnen des Locks
und der Ueberpruefung des Locks nicht unterbrochen wird.
Irgendwo im Netz(TM) hab ich mal was gefunden, wie man Locks nicht-atomar
IMO vernuenftig umsetzt und das fuer exklusive und nicht-exklusive Locks
erweitert. Kurzer Ausschnitt (bash):
getlock_exclusive() { # {{{
if [ -n "${1}" ] ; then
stalelock_exclusive "${1}" # check for stale lockfiles
stalelock_shared "${1}"
if [ -f "${1}.lock" ] && [ ! -w "${1}.lock" ] ; then
error "Can't write lockfile ${1}.lock!"
exit 1 # yes, the whole script dies
fi
if [ -e "${1}.lock" ] ; then
read pid < ${1}.lock
if [ ${pid} -ne ${$} ] ; then
return 1 # we don't have the lock
fi
else
echo "${$}" >>${1}.lock # we hope that this is atomic
fi
read pid < ${1}.lock # but we don't rely on it
if [ ${pid} -eq ${$} ] ; then
for x in ${1}.shared* ; do
[ -f "${x}" ] || continue
return 1 # as long as a shared lock exists, exclusive ones aren't granted
done
return 0
else
return 1
fi
fi
} # }}}
getlock_shared() { # {{{
if [ -n "${1}" ] ; then
stalelock_exclusive "${1}"
stalelock_shared "${1}"
[ -e "${1}.lock" ] && return 1 # no shared locks with an exclusive one in place
echo "${$}" >> "${1}.shared_${$}"
return 0
fi
} # }}}
Das Ganze funktioniert so:
Fuer einen exklusiven Lock wird in die Datei ${1}.lock die eigene PID
geschrieben (angehaengt, nicht ueberschrieben). Danach wird die erste Zeile
von ${1}.lock mit der aktuellem PID verglichen. Stimmen sie ueberein, gehoert
der Lock uns. Andernfalls war ein anderer Prozess schneller.
Ja, das Ganze haut ueber NFS nicht hin und auch nicht ueber Programmgrenzen
hinweg. Aber da ich das auch nicht benoetige in meiner Scriptsammlung kann
ich damit leben.
Gruesse,
Benjamin
--
Benjamin 'blindCoder' Schieder
Registered Linux User #289529: http://counter.li.org
finger blindcoder at scavenger.homeip.net | gpg --import
--
/lusr/bin/brain: received signal: SIGIDIOT
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname : nicht verfügbar
Dateityp : application/pgp-signature
Dateigröße : 189 bytes
Beschreibung: nicht verfügbar
URL : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20060717/f046b88e/attachment.sig>
Mehr Informationen über die Mailingliste linux-l