On 30 May 2013 15:29, Laurent Blume <[email protected]> wrote:
> On 30/05/13 16:15, Edward Ned Harvey (openindiana) wrote:
> <snip>
>
>> I see there are a bunch of C constructs available ... mutex_init,
>> etc. Surely there must be a wrapper application around this kind of
>> thing, right?
>
>
> I spent some time looking for a lock in shell some time ago. The overall
> conclusion was that the only atomic operation in pure shell is mkdir.
I don't know about pure/POSIX shell, but at least bash and ksh support
noclobber, which should do the trick. I've been using the following
idiom for some time without problems:
#!/bin/bash
GLOBAL_LOCKFILE=/var/run/whatever.lock
function get_lock {
( set -o noclobber; echo "$$" > "$1") 2> /dev/null
return $?
}
function have_lock {
[ -f $1 ] && [ $(cat $1) = $$ ]
return $?
}
function release_lock {
if have_lock $1; then
rm -f $1
fi
return 0
}
function cleanup {
# Whatever cleanup required
release_lock $GLOBAL_LOCKFILE
return $1
}
trap 'cleanup $?' INT TERM EXIT
if get_lock $GLOBAL_LOCKFILE; then
# Do stuff
fi
NB: I hacked that out of a larger and more complex script; I hope I've
selected the relevant bits, but I haven't actually tested it.
(This locking looks sane to me, and it's been working in practice for
months, but if anyone does see any obvious blunders do point them
out.)
_______________________________________________
OpenIndiana-discuss mailing list
[email protected]
http://openindiana.org/mailman/listinfo/openindiana-discuss