mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
70 lines
1.3 KiB
Bash
Executable file
70 lines
1.3 KiB
Bash
Executable file
#! /bin/sh
|
|
# Inspired by http://members.toast.net/art.ross/rute/node24.html
|
|
|
|
TAG=default
|
|
CMD=
|
|
|
|
help() {
|
|
echo "USAGE: lock_file (lock|unlock) [<tag>]"
|
|
echo
|
|
echo "lock_file locks or unlocks a lock file, for synchronization"
|
|
echo "across multiple processes. The lock command will block until"
|
|
echo "the lock can be obtained, upon which it exits with code 0."
|
|
echo "The exit code will be 1 on failures, and 2 on input error."
|
|
echo "You can use different tags for different locks."
|
|
}
|
|
|
|
while test "x$1" != "x"; do
|
|
case "$1" in
|
|
"-h"|"--help"|"-help"|"-?"|"help")
|
|
help
|
|
exit 0
|
|
;;
|
|
"lock")
|
|
CMD=lock
|
|
shift 1
|
|
;;
|
|
"unlock")
|
|
CMD=unlock
|
|
shift 1
|
|
;;
|
|
*)
|
|
TAG="$1"
|
|
shift 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
TEMPFILE="/tmp/lock_${TAG}.$$"
|
|
LOCKFILE="/tmp/lock_${TAG}.lock"
|
|
|
|
if test "${CMD}" = "lock"; then
|
|
|
|
{ echo $$ > $TEMPFILE; } >/dev/null 2>&1 || {
|
|
echo "You don't have permission to access `dirname $TEMPFILE`"
|
|
exit 1
|
|
}
|
|
|
|
while true; do
|
|
ln $TEMPFILE $LOCKFILE >/dev/null 2>&1 && {
|
|
rm -f $TEMPFILE
|
|
exit 0;
|
|
}
|
|
|
|
if test -e "$LOCKFILE"; then
|
|
kill -0 `cat $LOCKFILE` >/dev/null 2>&1 || {
|
|
echo "Removing stale lock file"
|
|
rm -f $LOCKFILE
|
|
}
|
|
fi
|
|
|
|
sleep 1
|
|
done
|
|
fi
|
|
|
|
if test "${CMD}" = "unlock"; then
|
|
rm -f $LOCKFILE && exit 0
|
|
exit 1
|
|
fi
|
|
|
|
exit 2
|