4

On Linux I use flock lock command to execute a command with an exclusive lock.

What is the standard operating system command of Solaris 10 to do the same in a shell?

3 Answers 3

4

There is no flock or similar command for Solaris. If I want to do simple locking I use mkdir as it's a atomic operation and avoids potential race conditions with the usual check file exists/touch combination.

if ! mkdir /tmp/lockdir >/dev/null 2>&1
then
    echo >&2 "Lock exists exiting"
    exit 1
fi
4
  • Is mkdir always atomic? I seem to recall buggy NFS implementations where it isn't, but then Solaris NFS is less buggy than most. Commented May 11, 2011 at 20:45
  • @Gilles: I don't know - I always create lock files in /tmp. Commented May 11, 2011 at 20:47
  • @Gilles, mkdir is meant to be atomic over NFS and is actually why it's recommended over a open/creat with O_EXCL. Now it is very well possible that there exist buggy implementations. Having said that, of all places, /tmp is the least likely to be over NFS Commented Jan 18, 2013 at 15:30
  • @StephaneChazelas Buggy NFS implementations aren't that rare: mail-archive.com/[email protected]/msg20456.html perlmonks.org/?node_id=983724 news.ycombinator.com/item?id=1037310 Commented Jan 18, 2013 at 21:51
2

After a small Usenet discussion I use the following as a workaround for flock -n lockfile -c command:

#! /bin/bash

if [ $# != 4 -o "$1" = '-h' ] ; then
   echo "Usage: flock -n lockfile -c command" >&2
   exit 1
fi

lockfile=$2
command=$4

set -o noclobber
if 2>/dev/null : > "$lockfile" ; then
   trap 'rm -f "$lockfile"' EXIT
   $BASH -c "$command"
else
   exit 1
fi
0

I'd combine the two ideas:

getLock() {
    PROG=$( basename $0 )
    SHAREDLOCK="/tmp/lockdir-$PROG"

    if mkdir "$SHAREDLOCK" >/dev/null 2>&1
    then
            trap 'rmdir "$SHAREDLOCK"' EXIT
            chmod 0 "$SHAREDLOCK" # discourage anyone from messing with it else the rmdir might fail
    else
            echo >&2 "Lock ($SHAREDLOCK) exists. exiting"
            exit 1
    fi

}

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.