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

Reply via email to