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?
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
mkdir always atomic? I seem to recall buggy NFS implementations where it isn't, but then Solaris NFS is less buggy than most.
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
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
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
}